专业编程基础技术教程

网站首页 > 基础教程 正文

结构体所占内存大小 结构体所占内存大小是所有成员所占的内存字节数计算

ccvgpt 2024-12-30 02:19:50 基础教程 2 ℃

1、对于空结构体

1、C语言中,空结构体所占内存大小为0

结构体所占内存大小 结构体所占内存大小是所有成员所占的内存字节数计算

2、C++中,空结构体所占内存大小为1

2、对于(非空)结构体

struct stu {
  char a; //占用1个字节
  int b;//占用4个字节
  float c;//占用4个字节
  double d;//占用8个字节
}

CPU为了提高寻址效率,使用了内存对齐规则

1、起始位置为该数据类型所占内存的整数倍,若不足则将不足部分填充,使其变为该数据所占内存的整数倍

2、结构体所占总内存为其成员变量中所占空间最大数据类型的整数倍

假定起始地址是1000,char a的存储地址就是1000;如果把int b放到1001,不符合内存对齐的规则1,1001,1002,1003都不满足,进行内存占位填充,1004满足存储int b,所以1004-1007存储int b;1008满足存储float c,所以1008-1011存储float c;因为double d占8个字节,1012无法满足内存对齐的规则1,向下查找,1012-1015进行内存占位填充,1016符合要求,所以从1016-1023存储double d。从图可以看出,a和b的内存不连续,b和c是内存连续的,c和d的内存不连续

该结构体所占内存大小为24

3、对于变长结构体

struct Bdata {
 	int len;
  char data[0];
};
//sizeof(Bdata) = 4;
/**某些编译器不支持char data[0];,需要用char data[1];替代
*这样结构体的大小就是sizeof(Bdata) = 8;(字节对齐)
*/

在上面的Bdata结构体中,b是一个数组名,但是该数组没有元素,该数组的真实地址紧随结构体Bdata之后

int len = 10;
    char str[10] = "123456789";
    cout << "Size of Bdata:" << sizeof(Bdata) << endl;
    Bdata* bData = (Bdata*)malloc(sizeof(Bdata) + len);
    memcpy(bData->data, str, len);
    cout << "bData's datab is:" << bData->data <<endl;
    free(bData);

Tags:

最近发表
标签列表