大话C语言:第42篇 结构体内存分配原则

既然结构是一组数据的集合,那么,结构体占用内存大小究竟该如何计算呢?例如,

#include <stdio.h>
#include <string.h>

// 结构体类型的定义
struct Student 
{  
    char name[30];
    int age;  
    double score;
}; 

int main()
{
    struct Student stu = {"peter", 20, 90.5};
    
    // 计算结构体大小
    // 结果是48字节
    printf("结构体变量stu占用内存大小=%d\n", sizeof(stu));
    
    return 0;
}

struct Student 结构体内存分配大小为48字节,为什么不是结构体中每个成员所占用内存之和(42字节)呢?也就是说,结构体占用的内存大小不一定是每个成员占用内存之和。

之所以这样,主要是因为结构体内存分配遵循一定的原则:

  • 顺序存储原则:结构体中的元素按照定义的顺序存放到内存中。每一个元素存入内存时,都会认为内存是以自己的宽度来划分空间的,因此元素存放的位置一定会在自己大小的整数倍上开始。这意味着,如果结构体中第一个元素的大小为n字节,那么它将从内存地址的某个n字节整数倍位置开始存放。

  • 内存对齐原则:为了提高内存访问的效率,编译器通常会对结构体成员进行内存对齐。这意味着,即使某个成员只需要占用较少的内存空间,编译器也可能在其后填充一些额外的字节,以确保下一个成员从合适的内存地址开始。这种对齐方式取决于目标平台或编译器的规定,可能是某个固定大小的整数倍(如4字节或8字节)。

  • 最小单元补齐原则:在计算结构体总大小时,如果计算出的总大小不是结构体中最宽元素长度的整数倍,编译器会将其补齐到最宽元素长度的整数倍。这样做是为了满足内存访问的效率和一致性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值