存储在结构中的元素是否彼此相邻
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 是结构的基地址,布局将如下所示。
- a 将存储在 $base+0
- b 将存储在 $base+4
- 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;
如果我有结构,请说:
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 是结构的基地址,布局将如下所示。
- a 将存储在 $base+0
- b 将存储在 $base+4
- 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;