既然结构是一组数据的集合,那么,结构体占用内存大小究竟该如何计算呢?例如,
#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字节)。
-
最小单元补齐原则:在计算结构体总大小时,如果计算出的总大小不是结构体中最宽元素长度的整数倍,编译器会将其补齐到最宽元素长度的整数倍。这样做是为了满足内存访问的效率和一致性。

1175

被折叠的 条评论
为什么被折叠?



