gpt4 book ai didi

c++ - GCC 上的#pragma pack(push, n)/#pragma pack(pop) 和 __attribute__((__packed__, aligned(n) )) 之间有什么区别?

转载 作者:可可西里 更新时间:2023-11-01 15:21:26 27 4
gpt4 key购买 nike

具体在 GCC 上(即用 GCC 编译两者),以下两者的工作方式有何不同?

struct foo1 {
char a;
int b;
} __attribute__((__packed__, aligned(n) ));

和:

#pragma pack(push, n)
struct foo2 {
char a;
int b;
};
#pragma pack(pop)

他们 appear to behave differently :

foo1 f1;
foo2 f2;

int& i1 = f1.b; // ok
int& i2 = f2.b; // cannot bind packed field 'f2.foo2::b' to 'int&'

为什么一个有错误而另一个没有?至少内存布局是否相同?

最佳答案

您没有说您使用的是哪个版本的 GCC,但您可以找到相应的手册 on-line .然而,它们在这些方面都非常兼容,因为属性和编译指示的行为一旦定义,通常会跨版本维护以实现兼容性。我将从 GCC 4.9.3 的手册中引用具体的内容,GCC 4.9.3 目前是 GCC 4 系列的最新可用版本。特别是关于 type attributes 的部分和 structure-packing pragmas是相关的。

GCC 手册对 #pragma pack 和 friend 说:

#pragma directives that change the maximum alignment of members of structures (other than zero-width bit-fields), unions, and classes subsequently defined.

(强调)。它说 __attribute__((packed)):

This attribute, attached to struct or union type definition, specifies that each member (other than zero-width bit-fields) of the structure or union is placed to minimize the memory required.

它说 __attribute__ ((aligned(n))):

This attribute specifies a minimum alignment for variables of the specified type, measured in bytes.

(强调已添加)。

因此,不,#pragma pack(n),有或没有 push,一般来说,与附加 __attribute__(( packed, aligned(n)) 到结构类型。前者指定受影响结构的成员在 n 字节或更细的边界上对齐。后者指定受影响结构的成员用最小允许的填充填充,并且为整个结构的实例选择的对齐要求必须不少于 n。它们不仅不相同,甚至不太相似。

您应该发现影响结构定义的 #pragma pack(1) 对实例布局的影响与将 __attribute__((packed)) 附加到该结构的定义。然而,即使它们实现了相同的目的,它们也不是同一件事。两者的行为和效果都在 C++ 规范之外,GCC 完全有权在其他方面区别对待它们。

但是,如果您想使用属性来影响结构成员的对齐方式,那么您至少需要在逐个成员的基础上应用一些属性。例如……

struct foo1 {
char a;
int b __attribute__((aligned(n)));
} __attribute__((packed));

...可能与...具有相同的效果

#pragma pack(push, n)
struct foo2 {
char a;
int b;
};
#pragma pack(pop)

...,取决于 n

关于c++ - GCC 上的#pragma pack(push, n)/#pragma pack(pop) 和 __attribute__((__packed__, aligned(n) )) 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33437269/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com