【发布时间】:2013-09-29 10:57:18
【问题描述】:
我正在尝试了解应该如何使用 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 提案 - Language support for class layout control - 建议添加(除其他外)[[layout(smallest)]] 属性,该属性应重新排序类成员,以使对齐成本尽可能小(这是程序员中的常用技术 - 但它通常会破坏类定义的可读性) .但这不等于 pragma(pack) 所做的!
【问题讨论】:
-
我认为
#pragma pack将永远是一个不可移植的扩展。某些架构不支持未对齐的内存访问。