二十万字C/C++、嵌入式软开面试题全集宝典六

目录

101、 字节对齐有什么作用?

102、 C语言中#pragma用法

103、 new和malloc的区别?

104、 malloc/calloc/realloc三者之间的区别?

105、 delete p;与delete[]p,allocator

106、 new和delete的实现原理,delete是如何知道释放内存的大小?

107、 malloc申请的存储空间能用delete释放吗

108、 函数参数入栈的顺序

109、 堆和栈区别

110、 堆与栈的优点和缺点

111、 内核空间 虚拟内存管理

112、 malloc与free的实现原理?

113、 malloc、realloc、calloc的区别

114、 __stdcall和__cdecl的区别?

115、 手写字符串函数 strcat, strcpy, strncpy, memset, memcpy实现

116、 使用智能指针管理内存资源,RAII

117、 手写实现智能指针类

118、 结构体变量比较是否相等

119、 位运算

120、 函数调用过程栈的变化,返回值和参数变量哪个先入栈?


 

101、 字节对齐有什么作用?

字节对齐的作用不仅是便于cpu快速访问,同时合理的利用字节对齐可以有效地节省存储空间。
编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。

 

102、 C语言中#pragma用法

1.#pragma message
#pragma message("消息文本") 当编译器遇到这条指令时,就在编译输出窗口中将消息文本打印出来。
2.#pragma code_seg
#pragma code_seg(["section-name"["section-class"]])
它能够设置程序中函数代码存放的代码段。当我们开发驱动程序时便就会使用到它。
3.#pragma once
只要在头文件的最开始加入这条指令就能够头文件被编译一次。
4.#pragma hdrstop
表示编译头文件到此为止,后面的头文件不进行预编译。
5.#pragma resouce
#pragma resouce"*.dfm"表示*.dfm文件中的资源加入工程。*.dfm中包括了外观定义。
6.#pragma warning
#pragma warning (disable:4507 34; once:4385; error:164) 等价于
#pragma warning (disable:4507 34) //不显示4507和30号警告信息
#pragma warning (once:4385) //4358号警告信息仅报告一次
#pragma warning (error:164) //把164号警告信息作为一种错误
7.#pragma comment
#pragma comment(...) 该指令将一个注释放入一个对象文件或可执行文件中,常用lib关键字帮我们链入一个库文件。
如:#pragma comment(lib,"user32.lib") 该指令用来将user32.lib库文件加入到本工程中。
8. #pragma pack
这条指令主要用作改变编译器的默认对齐方式。

103、 new和malloc的区别?

1.new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持;
2.使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。
3.new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。
4.new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL。
5.new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现)。malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。

104、 malloc/calloc/realloc三者之间的区别?

1)void *malloc(size_t size);
size表示要分配的字节数,其中要检测空间是否开辟成功,开辟失败时返回0。
作用:在内存中分配一个元素被初始化为0的数组。
2)void *calloc(size_t num, size_t size);
num表示元素的个数,size表示每个元素的大小
返回值:返回一个指向所分配空间的void指针。
作用:重新分配内存块
3)void *realloc(void* memblock,size_t size);
memblock指向原先分配的内存块,size表示新的内存块的字节大小。
返回值:返回一个指向重新分配(可能移动了)的内存块的大小。
注意:堆上的内存需要用户自己来管理,动态malloc/calloc/realloc的空间,必须free掉,否则会造成内存泄漏

105、 delete p;与delete[]p,allocator

1.动态数组管理new一个数组时,[]中必须是一个整数,但是不一定是常量整数,普通数组必须是一个常量整数;
2.new动态数组返回的并不是数组类型,而是一个元素类型的指针;
3.delete[]时,数组中的元素按逆序的顺序进行销毁;
4.new在内存分配上面有一些局限性,new的机制是将内存分配和对象构造组合在一起,同样的,delete也是将对象析构和内存释放组合在一起的。allocator将这两部分分开进行,allocator申请一部分内存,不进行初始化对象,只有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子木呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值