基础知识,其实是比较简单的。(本文是以32位机为标准)
结构体如何分配内存也是根据cpu获得数据的方式来决定的,因为数据最终是cpu来获得,那么cpu是怎么获得数据的?
cpu获得数据方式是一次性获得尽量多的完整的数据。,下面看为了得到 '尽量多' 和 '完整' 数据怎么理解:
(1)cpu获得某一结构体数据时每次获得数据长度是一致的,不会是遇见char就读1个字节,遇见int就就读4字节,因为这样调换过去调换过来将会严重的影响cpu的效率。那么因该怎么来从结构体读出完整数据呢?
(2)为了取得结构体中完整的数据,cpu一次取得最小的数据长度为结构体数据之中最大类型长度(如int、char取一次数据就按int取)。这很容易理解,因为取少了数据就有可能不完整了。(32位机中有double取一次数据也是按照int长度取,毕竟32位机最多一次也只能取int的长度)
结构体在内存中分配位置的方式当然应该和cpu读取方式相符合。
(3)首地址必须位于结构体中最大数据类型长度整数倍的地址处。这种方式可以更好的节约内存,并且提高cpu提取数据的效率。
(4)其中尽量多是指在取一次数据操作时,该操作能尽量取得多的数据。
下面看例子来解释:
struct
{
char a;
int b;
char c;
}A;
通过sizeof可以得到结构体大小的结果为12。按照上述理解:cpu取一次数据是最小长度是4(因为 sizeof(int) = 4),它在获得第1次数据后只能得到了成员a,它在获得第2次数据后只能得到了成员b,它在获得第3次数据后只能得到了成员c,内存中存储与之相匹配,所以结果为4+4+4=12。
调整位置后新结构体:
struct
{
char a;
char c;
int b;
}B
通过sizeof可以得到结构体大小的结果为8。按照上述理解:cpu取一次数据是最小长度是4(因为 sizeof(int) = 4),它在获得第1次数据后能得到了成员a和成员b,它在获得第2次数据后能得到了成员c,内存中存储与之相匹配,所以结果为4+4=8。
假如成员中有个double类型呢?
struct
{
char a;
char c;
double b;
}C;
cpu取一次数据是最小长度还是4,因为32位机嘛。sizeof后的结果就是上一个例子加上4,4+4+4 = 12。
了解原理其它的就都会。