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

时间:2015-01-17 09:29:12

标签: c++ c++11 struct

如果我有结构,请说:

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]
但是在struct的情况下,每个元素是否彼此相邻存储(在结构A中)?

4 个答案:

答案 0 :(得分:7)

编译器可以按照自己的意愿插入填充,但第一项之前除外。

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

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

答案 1 :(得分:4)

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

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

你的具体案例是" luky"对于大多数编译器,因为int通常实现为"更好地适合处理器整数运算的积分"。有了这个想法,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;

答案 2 :(得分:3)

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

  1. a将存储在$ base + 0
  2. b将存储在$ base + 4
  3. c将存储在$ base + 8 ... etc
  4. 您可以在http://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86

    看到典型的对齐值

答案 3 :(得分:-1)

我编写了一个简单的程序来显示strut元素彼此相邻

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;
}
  

输出:1,2,3

请记住,[]或*(i + 1)是符合指针的语义构造,而不是直接使用struct变量。

正如干杯和赫斯所说。 - Alf 的答案,可以在struct元素之前或之后填充。