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 提案 -类布局控制的语言支持- 建议添加(除其他外)[[layout(smallest)]]属性,该属性应重新排序类成员,以使对齐成本尽可能小(这是程序员之间的常用技术 - 但它通常会破坏类定义的可读性) . 但这等于 pragma(pack) 所做的!

4

3 回答 3

17

alignas无法替代#pragma pack

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

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

声明中所有对齐说明符的组合效果不应指定比如果省略所有对齐说明符(包括其他声明中的对齐说明符)被声明的实体所需的对齐方式更严格的对齐方式。

于 2013-09-24T09:43:47.463 回答
2

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

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

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

请考虑到 C 和 C++ 都被认为是“硬件友好”的语言,这不仅意味着“最小内存使用”语言,而且主要是专注于效率和快速处理的语言。数据对齐(当它不是严格要求“我需要存储什么”时)是一个暗示另一个概念的概念:“很多时候,软件和硬件就像生活一样:你需要牺牲才能达到更好的结果!”。

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

但是如果我们假设你的观点是这样的:你根本不关心软件的效率、功耗和速度,而只是你痴迷于(因为你的硬件限制或仅仅因为理论上的兴趣)“最小内存使用”,那么您可能会发现以下读数很有用:

(1)在C++中声明、操作和访问未对齐的内存

(2) C 避免对齐问题

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

(3)标准对未对齐的内存访问有何规定?

重定向到此标准的剪辑:

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

(5)未对齐的内存访问:是否已定义行为?[这是重复的,但也许有一些额外的信息]。

于 2019-08-24T20:35:48.563 回答
1

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

请查看 Bartlomiej Filipek 的出色作品:

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

于 2019-08-23T03:02:02.603 回答