alignof 和 alignas各版本异同

alignof 和 alignas各版本异同 学习内容本节学习 alignof 与 alignas 在各版本的异同后续请关注 学习C11/14/17/20/23关键词版本更替 将持续更新~~alignofC11引入的编译期运算符作用是获取一个类型或对象的最小对齐要求对齐值返回值是一个std::size_t类型的常量。计算机为了提升读写效率要求某些类型的数据必须存储在特定字节倍数地址上这个特定字节数就是对齐值coutchar: alignof(char)endl;// 输出 1coutint: alignof(int)endl;// 输出 4x86_64coutdouble: alignof(double)endl;// 输出 8x86_64coutlong long: alignof(longlong)endl;// 输出 8structTData{charc;inti;doubled;}coutalignof(TData)endl;// 输出8结构体中存在的最大对齐值coutalignof(int[5])endl;//输出4仅输出元素类型的对齐值alignasC11引入关键字核心是显式指定类型、变量或数据成员的内存对齐要求强制要求数据存储在指定字节倍数的内存地址上。可以用它提升无法降低默认对齐值或为自定义类型/变量指定更严格的对齐规则直接要求某类型按照多少字节对齐为自定义类型指定对齐确保其内存布局满足特定要求structalignas(16)TData{charc;inti;doubled;};coutTData对齐值alignof(TData)endl;//16cout TData大小sizeof(TData)endl;//16为变量指定对齐适用于需要特殊内存对齐的场景alignas(32)intarr[4];coutarr 对齐值 alignof(arr)endl;// 32alignas(double)charbuf[10];cout buf 对齐值 alignof(buf)endl;// 8为结构体成员指定对齐C11起支持 )structTData{charc;alignas(8)inti;//i现在是8字节对齐doubled;coutTData 对齐值 alignof(TData)endl;// 8coutTData 对齐值 alignof(TData)endl;//必须是最大对齐数的整数倍 24字节注意 不能降低默认对齐alignas只能指定大于等于类型默认对齐值的数否则编译器会忽略该设置或报错alignas(2) int a; //error int默认是4多alignas取最大值如果为同一对象类型指定多个alignas编译器会取最大的那个structalignas(8)alignas(16)TData{};//选用16参数类型限制只能是整数常量表达式或类型名对齐值必须是2的幂结构体最终大小必须是对齐值的整数倍C17 微小优化无语法变化允许在static_arrert里自由地使用alignofstatic_assert(alignof(TData)8,对齐必须是8);static_assert(alignof(int)4,int必须是4);修复编译器在类模板、别名模板中的对齐推导C20 重要增强alignof变成constexpr表达式alignof(T)是编译期常量可以用在任何constexpr环境里constexprstd::size_t salignof(int);alignas可用于lambda捕获对象允许给lambda内部变量指定对齐constexpr上下文中支持对齐检查constexprboolcheck(){returnalignof(int)4;}C23 小修复允许在opaque/不完整类型上更安全地使用alignof统一了不同编译器对空类的对齐规则opaque指的是不透明类型、不完整类型不完整类型只声明不定义struct TData; //不完整类型class MyClass; //不完整类型void fun(); //函数不是类型在C11~C17之间不能对不完整类型使用alignof