听说,在C,所包含的内部结构阵列可以具有填充添加在所述阵列的元件之间的传言。现在很明显,填充量不能任意一对元件或计算在阵列中的下一个元素之间变化是不可能的简单指针运算。

此传闻还指出,它不包含在结构阵列被保证不包含填充。我知道至少一部分是真实的。

因此,在代码,传闻是:

{
    // Given this:
    struct { int values[20]; } foo;
    int values[20];

    // This may be true:
    sizeof(values) != sizeof(foo.values);
}

我敢肯定,sizeof(values)永远等于sizeof(foo.values)。不过,我一直无法找到C标准(特别是C99)任何明确证实或否认这一点。

没有人知道这个传言在任何C标准处理?

修改:我知道有可能是阵列foo.values的端部和该结构foo的端部的标准状态之间,并且填充会有foo的开始之间没有填充和foo.values的开始。然而,没有人有从引用参考那里说有foo.values的元素

之间没有填充的标准
有帮助吗?

解决方案

没有,永远不会有一个阵列的元件之间填充英寸这是专门不允许的。 C99标准调用数组类型“数组类型描述了连续分配的非空的对象集...”。对于对比度,这样的结构是“顺序”,而不是“连续”分配。

有可能是之前或在结构内的阵列后填充;这是完全另一种动物。编译器可能会做,以帮助该结构的调整,但C标准并没有说明任何东西。

其他提示

小心这里。填充可以在结构的末尾添加,但是数组的元素之间将不会被添加为你在你的问题的状态。阵列将始终引用连续的存储器,虽然结构的阵列可以具有填充添加到每个元件与结构本身的一部分。

在你的实施例中,valuesfoo.values阵列将具有相同的尺寸。任何填充将是结构foo代替的一部分。

这里的解释,以为什么的结构可能需要它的成员之间或甚至其最后一个成员后填充,以及为什么阵列并不:

不同类型可能有不同的对齐要求。有些类型需要的单词边界,其他人两倍甚至四字边界对齐。为了实现这一点,一个结构可以包含其成员之间的填充字节。可能需要后填充字节,因为存储器位置直接ofter的结构也必须符合该结构的对准要求,即,如果是bar类型struct foo *的,然后

(struct foo *)((char *)bar + sizeof(struct foo))

产生一个有效的指针struct foo(即,不会由于未对准)。

由于每个阵列的“成员”具有相同的对齐要求,没有理由以引入填充。这适用于包含在结构以及阵列真:如果数组的第一elment正确对齐,所以全部下列元素

是,排序的。变量常常向一些boundry,根据变量。采取以下,例如:

typedef struct
{
    double d;
    char c;
} a_type_t;

双和炭为8首1个字节,在我的系统,分别。 9.该结构总,但是,将16个字节,使得双打将始终是8字节对齐。如果我刚用过的整数,字符等,然后对准可能是1,2,4,或8。

有关某些类型T,sizeof(T) 可能或可能不等于 sizeof(T.a) + sizeof(T.b) + sizeof(T.c) ...

通常,这是完全编译器和体系结构相关的。在实践中,它永远不会很重要。

考虑:

struct {
  short s;
  int i;
} s;

假设短裤是16位,并且你在32位,大小将可能是8个字节,因为每个结构成员趋于对准的字(在本例中32位)边界。我说“可能”,因为它是可以通过编译器标志和变化实现特定的行为等。

这是值得强调的是这并不一定由C标准定义的实施行为。很像的短裤,整数和长的尺寸(C标准只是说短裤不会大于整数和长不会比整数较小,这可如16/32/32结束,16/32/64 ,32/32/64或数量的其它配置)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top