与#define相比,const有什么优点
- 首先,const能够明确指定类型。
- 其次,可以使用C++的作用域规则将定义限制在特定的函数或文件中。
- 第三,可以将const用于更复杂的类型,如数组和结构。
《C++ Primer Plus(第六版)》 第三章 处理数据 3.2 const限定符
与#define相比,内联函数有什么优点
- 内联函数能够明确指定形参和返回类型。
- 内联函数参数为值传递,不用担心修改实参。
- 可以将内联函数用于更复杂的类型,如数组和结构。
《C++ Primer Plus(第六版)》 第八章 函数探幽 8.1 C++内联函数
C++中的两种多态性
- C++中包含两种多态性:静态多态性和动态多态性,前者是通过函数重载实现的,后者是通过虚函数和动态联编实现的。
栈和堆的区别
- 管理方式不同: 栈是由编译器自动申请和释放空间,堆需要程序员手动申请和释放。
- 空间大小不同: 栈的空间是有限的,在32位平台下,VC6下默认为1M,堆最大可以到4G。
- 能否产生碎片: 栈和数据结构中的栈原理相同,在弹出一个元素之前,上一个已经弹出了,不会产生碎片;而如果不停地调用malloc、free会造成内存碎片很多。
- 生长方向不同: 堆生长方向是向上的,也就是向着内存地址增加的方向,栈刚好相反,想着内存减小的方向生长。
- 分配方式不同: 堆都是动态分配的,没有静态分配的堆。动态分配由malloc函数进行。栈有静态分配和动态分配,静态分配是编译器完成的,比如局部变量的分配,栈的动态分配和堆是不同的,它的动态分配是由alloca函数进行,编译器进行释放,无需手动实现。
- 分配效率不同: 栈的效率比堆高很多。栈是机器系统提供的数据结构,计算机在底层提供栈的支持,分配专门的寄存器来存放栈的地址,压栈出栈都有相应的指令。堆是由库函数提供的,会按照一定的算法搜索内存,因此比较慢。
https://www.bilibili.com/video/BV13V411u7Ky
linux中memcpy能从用户空间拷贝到内核空间吗
- 能
结构体内存对齐(不考虑对齐系数)
- 第一个数据成员偏移值为0,之后每个数据成员起始位置从自身大小的整数倍开始存储。
- 若结构体包含子结构体,其起始位置从子结构体最大元素大小的整数倍开始存储。
- 数组从该数组元素大小的整数倍开始存储
- 结构体最终大小必须为最大数据成员大小(子结构体以其中最大元素大小计),不足应补齐。
- 函数、静态变量不计入结构体大小。
数据类型 | 32位 | 64位 |
---|---|---|
(unsigned) char | 1 | 1 |
(unsigned) short | 2 | 2 |
(unsigned) int | 4 | 4 |
(unsigned) long | 4 | 8(区别) |
(unsigned) long long | 8 | 8 |
float | 4 | 4 |
double | 8 | 8 |
pointer 指针 | 4 | 8(区别) |
什么是左值
- 左值参数是可被引用的数据对象,例如,变量、数组、结构成员、引用和解除引用的指针都是左值。
- 非左值包括字面常量(用引号括起的字符串除外,它们由其地址表示)和包含多项的表达式。
- 在C语言中,左值最初指的是可出现在赋值语句左边的实体,但这是引入关键字const之前的情况。
- 右值——不能通过地址访问的值。
《C++ Primer Plus(第六版)》 第八章 函数探幽 8.2.3 引用的属性和特别之处
尽可能将引用参数声明为常量参数
- 使用const可以避免无意中修改数据的编程错误。
- 使用const使函数能够处理const和非const实参,否则将只能接受非const数据。
- 使用const引用使函数能够正确生成并使用临时变量。
《C++ Primer Plus(第六版)》 第八章 函数探幽 8.2.3 引用的属性和特别之处
常量指针与指针常量
- 常量指针: const typeName* p; 即指向常量的指针,该指针指向的类型为常量,不能修改*p的值。
- 指针常量: typeName* const p; 该指针为常量,不能修改p的指向。
复制构造函数被调用的三种情况
- 定义一个对象时,以本类另一个对象作为初始值,发生复制构造;
- 如果函数的形参是类的对象,调用函数时,将使用实参对象初始化形参对象,发生复制构造;
- 如果函数的返回值是类的对象,函数执行完成返回主调函数时,将使用return语句中的对象初始化一个临时无名对象,传递给主调函数,此时发生复制构造。