相关疑难解决方法(0)

内存对齐:如何使用alignof/alignas?

我现在正在使用共享内存.

我无法理解alignofalignas.

cppreference不清楚:alignof返回"对齐"但什么是"对齐"?要为要对齐的下一个块添加的字节数?填充尺寸?堆栈溢出 /博客条目也不清楚.

有人能解释清楚alignofalignas

c++ x86-64 memory-alignment c++11

60
推荐指数
5
解决办法
2万
查看次数

是否保证POD结构或标准布局类型的成员根据其对齐要求进行对齐?

给定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对象中可能存在未命名的填充,但不是在其开头,以实现适当的对齐.]

[重点在上述所有引文中加入.]

c++ memory-alignment language-lawyer c++11 c++03

13
推荐指数
2
解决办法
784
查看次数

为什么对齐long long union成员比包含union/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)

c++ g++ memory-alignment unsigned-long-long-int unions

8
推荐指数
1
解决办法
1249
查看次数