目录
104、 malloc/calloc/realloc三者之间的区别?
105、 delete p;与delete[]p,allocator
106、 new和delete的实现原理,delete是如何知道释放内存的大小?
115、 手写字符串函数 strcat, strcpy, strncpy, memset, memcpy实现
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申请一部分内存,不进行初始化对象,只有