结构体如何分配内存

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tyhaotingdege/article/details/69935596

基础知识,其实是比较简单的。(本文是以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。

了解原理其它的就都会。

猜你喜欢

转载自blog.csdn.net/tyhaotingdege/article/details/69935596
今日推荐