我试图了解应该如何使用 alignas,我想知道它是否可以替代 pragma pack,我已经努力验证它但没有运气。使用 gcc 4.8.1 ( http://ideone.com/04mxpI ) 我总是得到低于 STestAlignas 的 8 个字节,而使用 pragma pack 它是 5 个字节。我想要实现的是让 sizeof(STestAlignas) 返回 5。我尝试在 clang 3.3 ( http://gcc.godbolt.org/ ) 上运行此代码,但出现错误:
!!错误:对于“long”类型,请求的对齐小于 8 的最小对齐 - 刚好低于 alignas 的使用。
那么也许 alignas 有一个最小对齐值?
下面是我的测试代码:
#include <iostream>
#include <cstddef>
using namespace std;
#pragma pack(1)
struct STestPragmaPack {
char c;
long d;
} datasPP;
#pragma pack()
struct STestAttributPacked {
char c;
long d;
} __attribute__((packed)) datasAP;
struct STestAlignas {
char c;
alignas(char) long d;
} datasA;
int main() {
cout << "pragma pack = " << sizeof(datasPP) << endl;
cout << "attribute packed = " << sizeof(datasAP) << endl;
cout << "alignas = " << sizeof(datasA) << endl;
}
gcc 4.8.1 的结果:
pragma pack = 5
attribute packed = 5
alignas = 8
[26.08.2019]
在这个主题中似乎有一些标准化运动。p1112 提案 -类布局控制的语言支持- 建议添加(除其他外)[[layout(smallest)]]
属性,该属性应重新排序类成员,以使对齐成本尽可能小(这是程序员之间的常用技术 - 但它通常会破坏类定义的可读性) . 但这不等于 pragma(pack) 所做的!