【发布时间】:2021-02-15 14:03:13
【问题描述】:
对于大多数 C 编译器,可以在结构上指定编译器属性,以定义该结构的成员如何在内存中对齐。例如:
typedef struct{
char a;
char b;
} __attribute__((aligned(2))) TwoChars;
如果char a 最终位于地址 0xA(为简单起见),那么 char b 将不会位于地址 0xB,而是 0xC,因为它与 2 个字节对齐。
我的问题是:这个属性是由结构成员继承的吗?例如:
typedef struct{
char a;
char b;
} TwoChars;
typedef struct {
TwoChars tc;
char c;
} __attribute__((aligned(1))) ThreeChars;
这在记忆中最终会是什么样子? } __attribute__((aligned(2))) TwoChars 怎么样?
【问题讨论】:
-
这可以用你最喜欢的编译器轻松测试...这些属性无论如何都是编译器扩展
-
如果它是“继承的”,我会感到惊讶。出于一个简单的原因,可以分别编译两个不同的翻译单元,一个具有“普通”
TwoChars变量,一个具有ThreeChars。这些应该是兼容的。但是如果它是第二个TU的继承者,那么他们不会。 -
是的,我想您的问题更适用于
packed属性,如下面的答案所指出的那样。 -
我用 GCC 标记了这个,因为它是一个非标准的编译器特定的扩展。让我知道是否可以。
标签: c gcc struct memory-alignment