struct所占的内存
空结构体所占内存为1 用来区分结构体
#pragma pack(n)指定按照n对齐
vs默认用8对齐
计算方式:(表面理解)
1.先找出最大的类型变量
2.在它之前的总内存必须和最大类型对齐(整数倍)
3.在它之后的总内存必须和最大类型对齐(整数倍)
深度理解:
1.每个成员按其类型大小和指定对齐参数n中较小的一个进行对齐
2.确定的对齐参数必须能够整除起始地址(或偏移量)
3.偏移地址和成员占用大小均需对齐
4.结构体成员的对齐参数为其所有成员使用的对齐参数的最大值
5.结构体总长度必须为所有对齐参数的整数倍
代码实现:
struct person
{int a;char c;double d;char e;
};
int main()
{struct person p;cout << "p所占的内存:" <<sizeof(p) << endl;
}
struct person
{int a;int b;double d;
};
int main()
{struct person p;cout << "p所占的内存:" <<sizeof(p) << endl;
}
当含有数组时:把数组拆分计算
struct person
{int b[5];double d;
};
int main()
{struct person p;cout << "p所占的内存:" <<sizeof(p) << endl;
}
#pragma pack(n)的使用n(1,2,4,8,16)
(当n大于最大数据类型字节时失效,取两者的小值)
- 先找到最大类型位置
- 前半部分内存和为n的倍数
- 后半部分也要为n的倍数
未设置#pragma pack(n) 结果为:24
struct person
{char c;double b;int a;};
设置#pragma pack(16) 结果为:24 当n>最大数据类型时 取数据类型的值
#pragma pack(16)
struct person
{char c;double b;int a;};
设置#pragma pack(4) 结果为:16 当n<最大数据类型时 取n
#pragma pack(4)
struct person
{char c;double b;int a;};
设置#pragma pack(2) 结果为:14
#pragma pack(2)
struct person
{char c;double b;int a;};
设置#pragma pack(1) 结果为:13
#pragma pack(1)
struct person
{char c;double b;int a;};
复杂的结构体内存计算:
32位下:
struct person{enum per{A,B,C,D,E}G; //枚举要定义int a[10];char c;double b;int *p;union H{int n;double l;}Y; //结构体也要定义};person *p;cout << sizeof(p) << endl;//指针占4个字节(32位) 64位的话是 8个字节cout << sizeof(*p) << endl; //结果位 72个字节cout << sizeof(p->a) << endl;// 占40个字节cout << sizeof(p->b) << endl;// 占8个字节cout << sizeof(p->c) << endl;// 占1个字节cout << sizeof(p->d) << endl;// 指针占4个字节(32位) cout << sizeof(p->G) << endl;// 占4个字节(枚举类型)cout << sizeof(p->Y) << endl;// 占8个字节(联合体取最大内存)
计算图解:
注意事项:未定义的 枚举类型和联合体不占用内存
struct person{enum per{A, B, C, D, E};union H{int n;double l;};};person p;cout << sizeof(p) << endl;//指针占1个字节空结构体占用一个字节,来区分结构体
在这里补充一个问题:(感谢评论区提出的问题)
注意内存分配的问题:
struct MyStruct
{int b;char c;short d;short e;char f;short g;
}a1;
void main()
{cout << sizeof(a1) << endl;
}
如果按照正常的计算方法:
int 为最大类型 对齐字节为 4
所以 cdefg相加的结果为 1+2+2+1+2=8 刚好为4的倍数,所以结果为12 但结果为16
这里需要注意一个细节,就是跨越对齐字节问题,
(当一个数据跨越了两个对齐字节时,当存放不下时需要额外的分配一个对齐字节,不得跨越对齐字节)
struct MyStruct
{int b;char c;short d;short e;
}a1;
void main()
{printf("%p\n", &a1.b);//获取地址printf("%p\n", &a1.c);printf("%p\n", &a1.d);printf("%p\n", &a1.e);cout << sizeof(a1) << endl;
}
这里结果为12 ,它的内存分配解释如下:
一般会以为:c+d+e=5,然后在5后面补充3个字节
实际上:由于c+d=3 4-3=1 1个字节存放不了 e(2个字节),所以补充一个字节,
然后开辟新的4个字节 存放 e+2(两个补充字节)
图解为:
返回到之前的问题:结果为什么为16
计算方式为:(红字为填充)
4 + (1+2+1) +(2+1+1)+(2+2)=16
图解为:
再例如:
struct MyStruct
{char a;int b;int c;double d;
}a1;
void main()
{printf("%p\n", &a1.a);printf("%p\n", &a1.b);printf("%p\n", &a1.c);printf("%p\n", &a1.d);cout << sizeof(a1) << endl;}
还有补充有多个最大数据类型时的计算:
计算方法为:把最大类型变量当作节点,节点左右两边的类型字节对齐。
struct MQ
{char a;int b;char c;short d;short e;char f;short g;int h;char k;
};
void main()
{cout << sizeof(MQ) << endl;}
计算过程为:
struct所占的内存相关推荐
- .net托管环境下struct实例字段的内存布局(Layout)和大小(Size)
在C/C++中,struct类型中的成员的一旦声明,则实例中成员在内存中的布局(Layout)顺序就定下来了,即与成员声明的顺序相同,并且在默认情况下总是按照结构中占用空间最大的成员进行对齐(Alig ...
- 关于共用体所占的内存空间的问题
共用体 `共用体(联合)` 共用体类型变量的定义 共用体变量的引用方式 共用体类型数据的特点 [例1]分析程序运行结果 [实训内容3]输入并运行以下程序,从输出的结果体会"共用"的 ...
- 100*100的 canvas 占多少内存?
题目 100*100的 canvas 占多少内存? 在 三年前端,面试思考 中提到了一个题目,非常有新意,这里分享一下当时面试的思考过程. 解题思路 其实真正的答案是多少我并不清楚,面试过程中面试官也 ...
- [html] 请问60*80的canvas占多少内存?你是怎么计算的?
[html] 请问60*80的canvas占多少内存?你是怎么计算的? 一个像素为1byte,通过getImageData方法可以得到canvas的二进制流 个人简介 我是歌谣,欢迎和大家一起交流前后 ...
- 这4个小程序为什么有很多人在用,仅仅是因为不占手机内存空间?
现在小程序真是无处不在,各种类型的都有,小程序是很多没错,那APP也很多,为什么使用小程序的人越来越多,难道就难道仅仅是因为不占手机内存空间吗?原来不是,是因为下面这个4款小程序真的很实用. 1.小橘 ...
- 为什么一个盘里的文件夹都不见了,里面一片空白,但那些文件所占的内存却还在的,但好像没被删除
硬盘空间占用但没文件,硬盘空间占用但文件消失了为什么一个盘里的文件夹都不见了,里面一片空白,但那些文件所占的内存却还在的,但好像没被删除 工具/软件:AornData软件 步骤1:先百度搜索并下载程序 ...
- 照片别放在手机相册了!跟我学,放这4处地方安全又不占手机内存
你喜欢拍照吗?你有没有觉得照片放在手机相册里,既占内存又不太安全? 作为一名拍过5W张照片的摄影爱好者,我的照片从来都不放在手机相册里,不然就太对不起我的16G乞丐版了! 那照片放哪既安全又不占手机内 ...
- 计算机病毒占内存吗,蠕虫病毒占多少内存
蠕虫病毒通常会感染Windows 2000/ XP/Server 2003系统,如果不及时预防,它们就可能会在几天内快速传播.大规模感染网络,对网络安全造成严重危害.蠕虫病毒会占用计算机内存,那么,蠕 ...
- android 内存占用60m,占60M内存的吃鸡
占60M内存的吃鸡是一款卡通像素风格的休闲向枪战游戏,游戏采用的是2.5D视角,这里炫酷的技能伴随着欢乐无限的射击,你还可以和自己的朋友一起组队激战,痛快吃鸡.感兴趣的朋友们快来西西下载体验吧! 游戏 ...
最新文章
- (转)Android 常用 adb 命令总结
- JEPaaS笔记||学习培训资料||案例视频 【全套】
- Python笔记-Json转DataFrame(基金主题Json数据)
- Charm Bracelet(POJ-3624)
- Select网络模型下的简单CS实例
- 因为造轮子,我一个月就转正了 | 原力计划
- html标签非成对,深入document.write()与HTML4.01的非成对标签的详解
- yii第三方插件snoopy配置
- iTween的用法总结
- Django order by 高级用法
- 智慧工厂是什么 智慧工厂方案举例 智慧工厂案例
- 豆瓣高分JAVA书籍,值得收藏
- 关于面试的方法和技巧都有哪些呢?
- #小何不断努力#8.18
- contentprovider与resolver使用
- (dedecms)织梦搬家后无法更新栏目
- c语言求n个数最大最小值,c语言 如何求n个数的最大值 最小值
- 8051单片机的存储器结构
- more命令的基本实现
- 64位字长的高性能微型计算机,地址总线字长内存容量寻址范围之间的计算