我试图了解应该使用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)]]
属性,该属性将对类成员进行重新排序,以使对齐成本尽可能小(这是程序员常用的技术-但通常会破坏类定义的可读性)。但这不等于pratma(pack)的! 最佳答案
alignas
不能替换#pragma pack
。
GCC接受alignas
声明,但仍使成员正确对齐:满足最严格的对齐要求(在这种情况下,为long
的对齐)也满足您指定的要求。
但是,GCC太宽容,因为该标准实际上在§7.6.2第5段中明确禁止这样做:
关于c++ - 如何使用alignas替代实用套件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18978006/