数是否有效的时候使用。)
“sizeof 引用" = 指向变量的大小 , "sizeof 指针"= 指针本身的大小
指针可以有多级,而引用只能是一级
2.5.new 与 malloc 的区别
malloc 与 free 是 C++/C 语言的标准库函数,new/delete 是 C++的运算符。它们都可用于申请
动态内存和释放内存。
对于非内部数据类型的对象而言,光用 malloc/free 无法满足动态对象的要求。对象在创建
的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。
new 可以认为是 malloc 加构造函数的执行。new 出来的指针是直接带类型信息的。而 malloc
返回的都是 void 指针。
2.6.智能指针怎么实现?什么时候改变引用计数?
构造函数中计数初始化为 1;
拷贝构造函数中计数值加 1;
赋值运算符中,左边的对象引用计数减一,右边的对象引用计数加一;
析构函数中引用计数减一;
在赋值运算符和析构函数中,如果减一后为 0,则调用 delete 释放对象。
2.7.内联函数,宏定义和普通函数的区别
内联函数要做参数类型检查,这是内联函数跟宏相比的优势
宏定义是在预编译的时候把所有的宏名用宏体来替换,简单的说就是字符串替换, 内联函
数则是在编译的时候进行代码插入,编译器会在每处调用内联函数的地方直接把内联函数的
内容展开,这样可以省去函数的调用的压栈出栈的开销,提高效率。
内联函数是指嵌入代码,就是在调用函数的地方不是跳转,而是把代码直接写到那里去。对
于短小简单的代码来说,内联函数可以带来一定的效率提升,而且和 C 时代的宏函数相比,
内联函数 更安全可靠。可是这个是以增加空间消耗为代价的
const 与#define 的区别:宏在预处理阶段替换,const 在编译阶段替换;宏没有类型,不做
安全检查,const 有类型,在编译阶段进行安全检查
2.8. C++内存管理
栈: 存放函数参数以及局部变量 , 在出作用域时 , 将自动被释放 . 栈内存分配运算内置
于处理器的指令集中 , 效率 很 高 , 但分配的内存容量有限 .
堆 :new 分配的内存块 ( 包括数组 , 类实例等 ), 需 delete 手动释放 . 如果未释放 , 在
整个程序结束后 ,OS 会帮你回收掉 .
自由存储区: malloc 分配的内存块 , 需 free 手动释放 . 它和堆有些相似 .
全局/静态区: 保存自动全局变量和 static 变量(包括 static 全局和局部变量)。静态区的内容
在整个程序的生命周期内都存在,有编译器在编译的时候分配(数据段(存储全局数据和静
态数据)和代码段(可执行的代码/只读常量))。
常量存储区: 常量 (const) 存于此处 , 此存储区不可修改 .