C++ - 杂项整理

字符串 如果需要用字符串字面值常量赋值和初始化一个char * ,应该使用const char *或者auto。 char *str = "hello world"; // 将出现弃用警告 数组 数组的长度必须是一个常量表达式,const常量不是常量表达式。 流程控制 c++17支持...

阅读更多

字节对齐

字节对齐 计算机中内存大小的基本单位是字节(byte),理论上来讲,可以从任意地址访问某种基本数据类型。 但是实际上,计算机并非逐字节大小读写内存,而是以2,4,8…的倍数的字节块来读写内存,如此一来就会对基本数据类型的合法地址作出一些限制,即它的地址必须是2,4,8…的倍数。那么就要求各种数据类型按照一定的规...

阅读更多

智能指针

智能指针本质就是一个类模板,它可以创建任意的类型的指针对象,当智能指针对象使用完后,对象就会自动调用析构函数去释放该指针所指向的空间。c++引入了 3 种类型的智能指针: std::unique_ptr :独占资源所有权的指针。 std::shared_ptr :共享资源所有权的指针。 std::...

阅读更多

左值和右值

左值与右值这两个概念是从 C 中传承而来的,左值指既能够出现在等号左边,也能出现在等号右边的变量;右值则是只能出现在等号右边的变量。 左值和右值在 C/C++ 中是表达式(expression)的一种属性,被称为值类别(value categories)。 表达式是指由运算符(operator)和运算对象(op...

阅读更多

左值引用和右值引用

左值引用 左值引用就是左值的别名,不是变量的别名,而是地址的别名,是与地址建立的一种映射关系。我们可以通过不同的别名访问同一块地址空间。 左值引用并非对象,只是为一个已经存在的对象所起的另外一个名字。 左值引用必须初始化,因为无法令左值引用重新绑定到另外一个对象。一旦初始化完成,左值引用将和他的初始值对象一直...

阅读更多

内存布局

在C++中,内存分成4个区: 栈(Stack) 堆(Heap) 数据段(Data Segment) 代码段(Code Segment) 栈 栈区主要存储以下几类数据: 函数的局部变量。 函数参数。 函数返回地址。 编译器生成的额外信息(如变量对齐信息)。 栈区的特...

阅读更多

链接属性

编译单元 编译器在编译代码时,只会去编译.cpp格式的源文件,并且预编译器会递归的把.cpp所有#include的头文件都拷贝到.cpp文件中去,之后对这个文件再进行编译,生成二进制的.obj文件,然后链接器会将所有的obj文件进行链接,生成最终可执行文件。所以每一个.cpp文件都是一个编译单元。 内部链接 如...

阅读更多

环境相关的预定义宏

操作系统 操作系统 预定义宏 Windows _WIN32, _WIN64 macOS __APPLE__, __MACH__ Linux...

阅读更多