C++11 委托构造

委托构造的使用方法类似成员列表初始化的变种; 注意: 如果在一个构造函数中使用了本类的委托构造,就不能再对成员使用列表初始化了; 会先执行委托构造函数的函数体,然后再执行本身的函数体; 虽然可以在构造函数中调用其他的构造函数,但已经被初始化的成员变量还会被当前的构造函数进行重置,有可能导致又变为原来的未初始化状态; class Test{ public: Test():Test(0, 0.1){ s = "Ah"; cout << "Test()\n"; } Test(int ii):Test(ii, 0.1, "Hi"){ cout << "Test(int)\n"; } Test(int ii, double dd):Test(ii, dd, "Hi"){ cout << "Test(int, double)\n"; } Test(int ii, double dd, string ss):i(ii), d(dd), s(ss){ cout << "Test(int, double, string)\n"; } void print(){ cout << "i = " << i << "\td = " << d << "\ts = " << s << endl; } private: int i; double d; string s; }; int main() { Test t(10); t....

May 13, 2022 · 1 min · Rick Cui

main 函数执行完后所执行的代码

静态变量在 main 函数前执行初始化 on_exit 注册的函数在 main 执行后再执行 void f(int state, void* msg){ cout << "after main exit.\n"; cout << "state: " << state << "\tmessage: " << (char*)msg << endl; } int main() { cout << "Hello World\n"; on_exit(f, (char*)"this is message"); cout << "end of main.\n"; return 0; } 输出: Hello World end of main. after main exit. state: 0 message: this is message

May 12, 2022 · 1 min · Rick Cui

大端、小端字节序

一、概念 计算机系统中内存是以字节为单位进行编址的,每个地址单元都唯一的对应着 1 个字节(8 bit) 有些类型的长度是超过 1 个字节的,比如 C/C++ 中,short 类型一般是 2 个字节,int 类型一般 4 个字节等。因此这里就存在如何安排多字节数据中,各字节存放顺序的问题。正是因为不同的安排顺序导致了大端存储模式和小端存储模式的存在。 大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中(高低低高) 小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中(高高低低) 假如有一个 4 字节的数据为 0x12345678(十进制:305419896,0x12 为高字节,0x78 为低字节),若将其存放于地址 0x4000 8000 中,则有: 内存地址 0x4000 8000(低地址) 0x4000 8001 0x4000 8002 0x4000 8003(高地址) 大端模式 0x12 0x34 0x56 0x78 小端模式 0x78 0x56 0x34 0x12 现状:...

April 21, 2022 · 2 min · Rick Cui

C++11 内存对齐 alignof alignas max_align_t

alignof( type-id ) 查询类型的对齐要求,以字节为单位 struct Storage { char a; int b; double c; long long d; }; // struct alignas(alignof(long double)) AlignasStorage { // struct alignas(long double) AlignasStorage { struct alignas(std::max_align_t) AlignasStorage { // max_align_t 相当于 alignof(long double) 内存对齐为 16 字节 // 这三种写法都可以 char a; int b; double c; long long d; }; struct Empty {}; struct alignas(64) Empty64 {}; int main() { std::cout << alignof(Storage) << std::endl; // 8 std::cout << sizeof(Storage) << std::endl; // 24 内存对齐为 8 字节,所以大小为 8 的整数倍 std::cout << alignof(AlignasStorage) << std::endl; // 16 std::cout << sizeof(AlignasStorage) << std::endl; // 32 内存对齐为 16 字节,所以大小为 16 的整数倍 int a = 10; int &b = a; std::cout << alignof(b) << std::endl; // 4 引用类型返回引用类型的对齐要求 int x[10]; std::cout << alignof(x) << std::endl; // 4 数组类型返回元素类型的对齐要求 std::cout << "Alignment of" "\n" "- char : " << alignof(char) << "\n" // 1 "- pointer : " << alignof(int*) << "\n" // 8 "- int : " << alignof(int) << "\n" // 4 "- long long : " << alignof(long long) << "\n" // 8 "- empty class : " << alignof(Empty) << "\n" // 1 "- alignas(64) Empty: " << alignof(Empty64) << "\n"; // 64 return 0; }

April 19, 2022 · 1 min · Rick Cui

C++17 折叠表达式

一元折叠表达式 ( pack op ... ) : 一元右折叠 (E op ...) 展开后: (E1 op (... op (EN-1 op EN))) ( ... op pack ) :一元左折叠 (... op E) 展开后: (((E1 op E2) op ...) op EN) 二元折叠表达式 ( pack op ... op init ) :二元右折叠 (E op ... op I) 展开后: (E1 op (... op (EN−1 op (EN op I)))) ( init op ....

April 13, 2022 · 3 min · Rick Cui