我正在尝试理解如何使用alignas,想知道它是否可以替代pragma pack。我已经尝试了很多方法来验证它,但没有成功。使用gcc 4.8.1 (http://ideone.com/04mxpI)编译下面的STestAlignas时,始终得到8字节的大小,而使用pragma pack得到的是5字节。我希望STestAlignas的sizeof返回值为5。我在clang 3.3(http://gcc.godbolt.org/)上运行了这段代码,但出现了错误:
!!error: requested alignment is less than minimum alignment of 8 for type 'long' - just below alignas usage.
那么,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
[2019年8月26日]
看起来在这个主题上有一些标准化的动向。提案p1112 - 支持类布局控制的语言支持 - 建议添加(其中之一)[[layout(smallest)]]
属性,该属性将重新排列类成员,使对齐成本最小化(这是程序员常用的一种技术,但通常会降低类定义的可读性)。但这与 pragma(pack) 的作用不同!
#pragma pack
将永远是一个不可移植的扩展。一些架构不支持未对齐的内存访问。 - R. Martinho Fernandes