要了解alignas 和alignof,您必须知道数据对齐是什么意思
很好的指南https://developer.ibm.com/articles/pa-dalign//
对齐(简而言之)
说明一
数据对齐意味着将数据放入内存中的地址等于字大小的某个倍数。
说明2
对齐是内存地址的一个属性,表示为以2的幂为模的数字地址。例如,地址 0x0001103F 模 4 为 3。据说该地址与 4n+3 对齐,其中 4 表示选择的 2 的幂。地址的对齐取决于选择的 2 的幂。相同的地址模 8是 7。如果一个地址的对齐方式是 Xn+0,则称该地址与 X 对齐。
CPU 执行对存储在内存中的数据进行操作的指令。数据由它们在内存中的地址标识。单个基准也有大小。如果它的地址与其大小对齐,我们称它为自然对齐的数据。否则称为错位。例如,如果用于标识它的地址具有 8 字节对齐,则 8 字节浮点数据自然会对齐。
好的。您了解“数据对齐”
恭喜!
什么意思alignas
说明
alignas (N) 指定仅将数据放置在 N 的倍数的地址中
N - 以 2 的幂为模的数字
语法:
alignas( the numeric address modulo a power of 2 )
alignas( alignof(type-id) )
alignas( type-id )
alignas 说明符可应用于:
示例:
struct alignas(256) name1 // every object of type name1 will be aligned to 256-byte boundary
{
float test[4];
};
alignas(128) char name2[128]; // the array "name2" will be aligned to 128-byte boundary
加法1
alignas 类型说明符是一种可移植的 C++ 标准方法
指定变量和用户定义类型的自定义对齐方式。
加法 2
#include <iostream>
struct alignas(16) Bar
{
int i; // 4 bytes
int n; // 4 bytes
alignas(4) char arr[3];
short s; // 2 bytes
};
int main()
{
std::cout << alignof(Bar) << std::endl;
}
当遇到多个 alignas 说明符时,编译器会选择最严格的一个,(值最大的那个)。
output: 16
加法 3
alignas 不能用于为类型提供比
type 没有这个声明就会有
什么意思alignof
语法:
alignof( type-id )
返回一个std::size_t类型的值
同样的定义有sizeof( type-id )
sizeof 和 alignof 有什么区别?
struct MyStruct
{
int x;
double y;
char z;
};
main()
{
std::cout << "The sizeof(MyStruct): " << sizeof(MyStruct) << std::endl;
std::cout << "The alignof(MyStruct): " << alignof(MyStruct) << std::endl;
}
output:
The sizeof(MyStruct): 24
The alignof(MyStruct): 8
结构填充
中的问题
结构填充是 C 中的一个概念,它添加一个或多个空
内存地址之间的字节以对齐内存中的数据
更多信息:Struct padding in C++
加法
结果是一个std::size_t类型的常量表达式,也就是说,它可以
在编译时进行评估。
更多信息在这里:
Source 1,
Source 2,