【内存对齐】第六篇·嵌套构造类型的对齐规则{数组}

2021/8/7 7:08:11

本文主要是介绍【内存对齐】第六篇·嵌套构造类型的对齐规则{数组},对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

上一篇:【内存对齐】第五篇·嵌套构造类型的对齐规则{结构体}

  • 结构体{ 数组 }
  • 数组 { 数组 } = 多维数组
  • 共用体 { 数组 }

结构体{ 数组 }

对于结构体中包含数组这种情况,还是比较常见的。按照数组的规则,和结构体嵌套结构体的规则,可以猜测:相当于将数组打开为多个同样大小的结构体成员。验证:

struct test_st{
char meat[3];
}test;
Size: 3 Address: 0x00000001004071a4

struct test_st{
char meat[3];
char vegatable;
int fruit;
}test;
Size: 8 Address: 0x00000001004071a8

这里能得到 8,说明是数组展开的方式,即 8=3+1+4。如果第二个 char 换成 short,应该是 3+1(padding)+2+2(padding)+4 = 12:

struct test_st{
char meat[3];
short vegatable;
int fruit;
}test;
Size: 12 Address: 0x00000001004071a8

果不其然。至此我们可以得到结论:

a. 结构体中包含数组时,结构体的大小等于数组展开为多个同样大小的成员后再整体计算得到的结构体大小。
b. 结构体中包含数组时,结构体的首地址只与整个结构体的size 有关,和结构体本身的规则相同。

数组 { 数组 } = 多维数组

数组中嵌套数组,其实就是我们说的多维数组,因其中每个元素类型都相同,所以应该和一维数组的规律没有差异。

typedef char inner[3];
inner test[2];
Size: 6 Address: 0x00000001004071a4

是的,与我们的猜想是一样的。为了避免表达上的差异,我们再改写一下:

char test[2][3];
Size: 6 Address: 0x00000001004071a4

结论:

a. 数组中嵌套数组,其大小 Size = 每个元素大小 * 总元素个数。
b. 数组中嵌套数组,其起始地址与 Size 有关,规则同数组本身的规则。

共用体 { 数组 }

共用体中嵌套数组

union test_u{
char grass[20];
char tree;
}test;
Size: 20 Address: 0x00000001004071b0

union test_u{
char grass[2];
int tree;
}test;
Size: 4 Address: 0x00000001004071a4

union test_u{
char grass[3];
char tree;
}test;
Size: 3 Address: 0x00000001004071a4

union test_u{
char grass[3];
short tree;
}test;
Size: 4 Address: 0x00000001004071a4

可以看到整个内嵌的数组整体作为一个成员占用了一部分内存区域。

整个共用体的 Size 由最大的共用体成员大小决定。
起始地址与 Size 有关,其规律同共用体。

连载中… by 2021/08/06
预计下次更新 DL: 2021/08/28

下一篇:【内存对齐】第七篇·嵌套构造类型的对齐规则{共用体}



这篇关于【内存对齐】第六篇·嵌套构造类型的对齐规则{数组}的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程