指针和引用的区别
1.建立一个变量或类的指针需要开辟新的内存,而引用不需要。
2.引用必须需要初始化,而指针不一定,但是指针最好初始化(不初始化),不要会变成野指针,误用野指针,会有严重的后果。
3.指针会被重新赋值,引用总是指向最初的对象。
4.sizeof(引用)是指向变量的大小,sizeof(指针)是指针本身指向的变量的大小。
5.自增运算意义不一样,指针自增是指向邻近的下一个元素,引用则是进行值加1的运算。
堆和栈的区别
1.管理方式: 栈是由编译器自动管理,无需手工控制。在c++11之前,堆的管理需要手工控制,自己开辟新内存,自己释放。在c++11之后,有了智能指针,自己开辟内存,不用人工释放,会自动释放,这也为使用c++进行多线程编程提供了方便。
2.空间大小: 一般来说,堆内存可以达到4GB。栈内存一般比较小,在MB这个量级,这也就造成了我们函数递归调用层数过多所导致的的堆栈溢出现象。
3.碎片问题: 堆不停的new/delete会造成大量的碎片,导致内存不连续,是程序运行效率降低。对于栈来说,不会造成碎片的问题,因为它是先进后出的,
4.生长方向: 堆来说,新分配的内存是延着内存增加的方向。栈来说,新分配的内存是沿着内存地址减小的方向。
5.分配效率: 栈的效率比堆的高。
new和delete是如何实现的,new与malloc的异同处
1.对于简单数据类型: new是直接调用operator new分配内存,operator new会调用malloc分配内存。delete直接调用free释放内存。
2.对于复杂数据类型: new先调用operator new分配内存再调用构造函数,delete先调用析构函数,再调用free释放内存。
3.对于简单数据类型: new[]和delete[]和new和delete没有区别
4.对于复杂数据类型: new[]分配内存时会多调用4个字节写入数组大小,数组的大小为调用构造函数的次数。Delete[]会根据写入数组的大小调用析构函数的,再释放内存。
struct和class的区别
1.默认的继承访问权限不同, Struct是public的,class是private的。
2.默认的数据访问控制不同, Struct是public的,class是private的。
3.class可以用于定义模板, struct不可以。
define和const的区别
1.define在预处理阶段进行替换,const在编译时确定其值。
2.define不分配内存,只是进行简单的替换,const会在静态存储区中分配空间。
3.define简单的替换会导致错误。
原文:https://www.cnblogs.com/hesper/p/10644802.html