网站首页 > 基础教程 正文
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);
猜你喜欢
- 2024-12-30 C++ 在编程语言谱系中的位置及其特点
- 2024-12-30 C++基础知识总结(超详细总结) c++ 基础
- 2024-12-30 [面试]C++中struct和class的区别是什么
- 2024-12-30 C++类和C语言的结构体有什么区别?linux C++第18讲
- 2024-12-30 C与C++利用pragma pack对结构体做成员打包对齐设置
- 2024-12-30 结构体的各种使用方法详细讲解-c\c++
- 2024-12-30 C++,结构体和类,结构体和类的区别,struct与class的区别
- 2024-12-30 C++编程:复合数据类型—结构体 c语言结构体复数运算
- 2024-12-30 C#与C++交互开发系列之复杂类型传递与解析
- 2024-12-30 C#和C++混合编程开发示例 c#,c++,c
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)