我现在正在使用共享内存.
我无法理解alignof和alignas.
cppreference不清楚:alignof返回"对齐"但什么是"对齐"?要为要对齐的下一个块添加的字节数?填充尺寸?堆栈溢出 /博客条目也不清楚.
有人能解释清楚alignof和alignas?
给定POD结构(在C++ 03中)或标准布局类型(在C++ 11中),所有成员都具有基本对齐要求,是否保证每个成员根据其对齐要求进行对齐?
换句话说,对于m_k{ m0... mn}标准布局类型的所有成员S,
struct S {
T0 m0;
T1 m1;
...
TN mn;
};
Run Code Online (Sandbox Code Playgroud)
是否保证评估以下表达式true?
(offsetof(S,m_k) % alignof(decltype(S::m_k))) == 0
Run Code Online (Sandbox Code Playgroud)
请给出C++ 03和C++ 11的答案,并引用标准的相关部分.支持C标准的证据也会有所帮助.
我对C++ 03标准(ISO/IEC 14882:2003(E))的阅读是关于POD结构中成员的对齐,除了第一个成员之外,它是静默的.相关段落是:
在规范的语言中,对象是"存储区域":
1.8 C + +对象模型[intro.object]
1.8/1 C++程序中的构造创建,销毁,引用,访问和操作对象.对象是存储区域....
根据对齐要求分配对象:
3.9类型[basic.types]
3.9/5对象类型具有对齐要求(3.9.1,3.9.2).完整对象类型的对齐是表示字节数的实现定义的整数值; 在满足其对象类型的对齐要求的地址处分配对象.
基本类型具有对齐要求:
3.9.1基本类型[basic.fundamental]
3.9.1/3对于每个有符号整数类型,存在相应的(但不同的)无符号整数类型:"unsigned char","unsigned short int","unsigned int"和"unsigned long int",每个它占用相同的存储量,并且具有与相应的有符号整数类型相同的对齐要求(3.9) ; ...
由于"实现对齐要求",可能会发生填充:
9.2班级成员[class.mem]
9.2/12声明没有插入访问说明符的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址.由访问说明符分隔的非静态数据成员的分配顺序未指定(11.1).实现对齐要求可能导致两个相邻成员不会立即分配 ; 因此,可能需要空间来管理虚拟功能(10.3)和虚拟基类(10.1).
9.2/12中的"已分配"一词与3.9/5中的"已分配"含义相同吗?规范中"分配"的大多数用法是指动态存储分配,而不是结构内部布局.使用可能在9.2/12中似乎意味着结构成员可能不严格要求3.9/5和3.9.1/3的对齐要求.
POD结构的第一个成员将根据结构的对齐要求进行对齐:
9.2/17指向POD结构对象的指针,使用reinterpret_cast进行适当转换,指向其初始成员(或者如果该成员是位字段,则指向它所在的单位),反之亦然.[ 注意:因此,在POD-struct对象中可能存在未命名的填充,但不是在其开头,以实现适当的对齐.]
[重点在上述所有引文中加入.]
从这个问题开始,人们可以开始相信联盟的一致性不低于其个体成员的最大一致性.但我对long longgcc/g ++中的类型有问题.完整的示例可以在这里找到,但这里是我的问题的相关部分:
union ull {
long long m;
};
struct sll {
long long m;
};
int main() {
#define pr(v) cout << #v ": " << (v) << endl
pr(sizeof(long long));
pr(__alignof__(long long));
pr(sizeof(ull));
pr(__alignof__(ull));
pr(sizeof(sll));
pr(__alignof__(sll));
};
Run Code Online (Sandbox Code Playgroud)
这导致以下输出:
sizeof(long long): 8
__alignof__(long long): 8
sizeof(ull): 8
__alignof__(ull): 4
sizeof(sll): 8
__alignof__(sll): 4
Run Code Online (Sandbox Code Playgroud)
为什么union成员的对齐大于包含union的对齐?
[UPDATE]
根据基思的回答,对齐在这里是错误的.但我测试了以下内容,似乎alignof 告诉我们真实情况.看到:
union ull {
long long m;
};
long long a;
char b; …Run Code Online (Sandbox Code Playgroud)