结构体如何分配内存

本文以32位机为例,详细介绍了CPU如何一次性获取结构体中的完整数据,并探讨了结构体在内存中如何分配位置以优化内存使用及提高CPU提取数据的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

了解原理其它的就都会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值