c++ - 32 位平台上结构中的 alignas

标签 c++ padding alignas

在 32 位 x86 linux 上运行以下代码时,我得到了意想不到的结果(编译器标志:g++ -std=c++14 -m32)。我试过 gcc 和 clang。

#include <iostream>
using namespace std;

struct S1
{
  uint64_t a;
  uint32_t b;
};

struct S2
{
  alignas(uint64_t) char a[8];
  uint32_t b;
};

int main()
{
  cout << "sizeof(S1)=" << sizeof(S1) << endl;
  cout << "sizeof(S2)=" << sizeof(S2) << endl;
}

输出是:

sizeof(S1)=12
sizeof(S2)=16

这里发生了什么?为什么 S1 和 S2 的大小不同?据我了解,64 位整数值在 32 位 x86 机器上与 32 位对齐。这确实解释了为什么 S1 的大小是 12 个字节。但为什么这不适用于 S2?

最佳答案

alignof 关键字衡量一个类型作为一个完整对象的对齐方式;即当它被分配为单个对象或数组元素时。这不一定与该类型作为子对象的对齐要求相同; Are members of a POD-struct or standard layout type guaranteed to be aligned according to their alignment requirements?

结构中 64 位整数的对齐由 x386 ABI 规定为 4 字节; gcc 不能随意更改它,因为它会破坏与其他目标文件和程序的二进制兼容性。但是,它可以将完整对象 64 位整数对齐到 8 个字节,因为这样做不会影响 ABI,并且可以更有效地访问内存。

关于c++ - 32 位平台上结构中的 alignas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34634317/

相关文章:

c++ - 对齐/偏移结构的特定成员

c++ - 在 C++11 中声明接口(interface)的最佳方法

html - CSS 表格填充问题

padding - 有没有办法使用填充来处理 "join"Flutter Widgets?

c++ - 对齐说明符 : on the type/on the member data

c++ - 将 operator new(sizeof(T) * N) 返回的内存视为数组

c++ - 如何为 Windows Phone 8 安装 libcurl

c++ - 有没有办法在 C++ 中调用基类函数的所有子类?

c++ - 如何将 boost::multi_array 放入构造函数的初始化列表中?

android - 如何在 ListView 中间添加一些空间?