如果我有结构,请说:
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中)?
答案 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是结构的基地址,布局将如下。
您可以在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元素之前或之后填充。