c++ - 如何使用alignas替换pragma pack?

标签 c++ gcc c++11 alignas

我正在尝试了解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

[2019年8月26日]

这个主题似乎有一些标准化运动。 p1112 提案 - Language support for class layout control - 建议添加(除其他外)[[layout(smallest)]] 属性,该属性应重新排序类成员,以使对齐成本尽可能小(这是程序员中的常见技术 - 但它通常会破坏类定义的可读性)。但这等于pragma(pack)所做的!

最佳答案

alignas 无法替换 #pragma pack

GCC接受alignas声明,但仍然保持成员正确对齐:满足最严格的对齐要求(在本例中,long的对齐)也满足要求您指定的。

但是,GCC 太宽松了,因为标准实际上在 §7.6.2 第 5 段中明确禁止这样做:

The combined effect of all alignment-specifiers in a declaration shall not specify an alignment that is less strict than the alignment that would be required for the entity being declared if all alignment-specifiers were omitted (including those in other declarations).

关于c++ - 如何使用alignas替换pragma pack?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18978006/

相关文章:

c++ - 在 boost::shared_ptr 完成时释放资源

c++ - 在类定义中动态分配内存有什么影响?

c++ - delete 和 delete[] 是如何实现的?

升级到 Mojave 后无法在 Mac 上编译 C 程序

c++ - 为什么这个类的成员变量在调用CUDA核函数时没有变化?

c++ - 将非静态成员函数作为回调传递

c++ - 如何返回对自定义容器中数据的对引用?

python - 无法安装mahotas,并且安装python-dev无法修复错误

c++ - gcc:链接外部库

c++ - 这是从容器中获取随机元素的 OK 范围方法吗?