如何使用alignas替换pragma pack?

时间:2013-09-24 09:40:23

标签: 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用法之下。

那么对齐可能有最小的对齐值吗?

下面是我的测试代码:

#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

3 个答案:

答案 0 :(得分:14)

alignas无法取代#pragma pack

GCC接受alignas声明,但仍保持成员正确对齐:满足最严格的对齐要求(在这种情况下,long的对齐)也满足您指定的要求。

然而,海湾合作委员会过于宽大,因为标准实际上明确禁止§7.6.2第5段:

  

声明中所有 alignment-specifiers 的组合效果不应指定比所有 alignment-specifiers所声明的实体所需的对齐更不严格的对齐被省略(包括其他声明中的那些)。

答案 1 :(得分:2)

我想您知道使用未对齐或未对齐的数据会带来风险和成本。

例如,检索5字节的未对齐数据结构比检索8字节的未对齐数据结构更耗时。这是因为,如果您的5个“ ...字节数据不是从这4个字节边界之一开始的,则计算机必须读取两次内存,然后将这4个字节在内部组装到单个寄存器中”(1)。 >

处理未对齐的数据需要进行更多的数学运算,并最终导致ECU消耗更多的时间(和功率)。

请注意,C和C ++都被认为是“硬件友好的”语言,这不仅意味着“最小内存使用量”语言,而且还主要集中在效率和牢度处理上。数据对齐(当并非严格要求“我需要存储什么”时)是一个概念,它暗示着另一个概念:“很多时候,软件和硬件都类似于生活:您需要做出牺牲才能获得更好的结果!”。 >

请,请考虑也要问自己,你没有错误的假设。类似的东西:“较小/ st结构=>更快/ st处理”。如果是这样,您可能(完全)错了。

但是,如果我们认为您的意思是这样的:您根本不关心软件的效率,功耗和牢固性,而只是痴迷(由于硬件限制或仅出于理论上的兴趣)在“最小内存使用量”中,那么也许您会发现以下读数很有用:

(1)Declare, manipulate and access unaligned memory in C++

(2)C Avoiding Alignment Issues

但是,请务必阅读以下内容:

(3)What does the standard say about unaligned memory access?

重定向到该标准的摘要:

(4)http://eel.is/c++draft/basic.life#1

(5)Unaligned memory access: is it defined behavior or not? [重复了,但也许有一些额外的信息]。

答案 2 :(得分:1)

不幸的是,在C ++ 11和C ++ 14中都没有保证对齐。 但是它在C ++ 17中得到了保证

请检查来自Bartlomiej Filipek的出色作品:

https://www.bfilipek.com/2019/08/newnew-align.html