存储在结构中的元素是否彼此相邻

Are elements stored in struct are next each other

如果我有结构,请说:

struct A {
int a,b,c,d,e;
}
A m;//struct if 5 ints
int n[5];//array of 5 ints.

我知道数组中的元素是一个接一个存储的,所以我们可以使用 *(n+i) 或 n[i]
但是在结构的情况下,每个元素是否彼此相邻存储(在结构 A 中)?

编译器可以根据需要插入填充,但第一项之前除外。

在 C++03 中,您可以保证在访问说明符之间增加项目的地址。

我不确定 C++11 中是否仍然存在访问说明符限制。

我已经编写了简单的程序来显示支柱元素彼此相邻

int main() {

    struct S {
        int a;
        int b;
        int c;
    };

    S s = {1,2,3};

    int* p = reinterpret_cast <int *> (&s);

    cout<<p[0]<<" "<<p[1]<<" "<<p[2];

    return 0;
}

Output : 1,2,3

请记住,[] 或 *(i+1) 是语义结构,适用于指针,而不是直接适用于结构变量。

正如 中所建议的那样干杯和 hth。 - Alf 的回答,在结构元素之前或之后可以有填充。

结构成员通常存储在递增的地址中,但它们不能保证是contiguous.so元素可能并不总是连续的。在上面的示例中,给定 $base 是结构的基地址,布局将如下所示。

  1. a 将存储在 $base+0
  2. b 将存储在 $base+4
  3. c 将存储在 $base+8 ...等

您可以在 http://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86

查看典型的对齐值

唯一允许的是成员存储顺序相同。 在元素之间可以有一些 "padding" 编译器可以插入,以便每个值与处理器字长对齐。

不同的编译器也可以根据目标平台做出不同的选择,并且可以通过选项开关或 pragma-s 强制保持给定的对齐方式。

对于大多数编译器,您的具体情况是 "luky",因为 int 通常实现为 "the integral that better fits the integer arithmetic of the processor"。有了这个想法,int-s 的序列按定义对齐。但情况可能并非如此,例如,如果您有

struct test
{
   char a;
   short b;
   long c;
   long long d;
};

您可以发现 (&a)+1 != &b(&b)+1 != &c(&b)-1 != &a 等。 授予的是进度&a < &b; &b < &c; &c < &d;