空结构体所占内存为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大于最大数据类型字节时失效,取两者的小值)

  1. 先找到最大类型位置
  2. 前半部分内存和为n的倍数
  3. 后半部分也要为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所占的内存相关推荐

  1. .net托管环境下struct实例字段的内存布局(Layout)和大小(Size)

    在C/C++中,struct类型中的成员的一旦声明,则实例中成员在内存中的布局(Layout)顺序就定下来了,即与成员声明的顺序相同,并且在默认情况下总是按照结构中占用空间最大的成员进行对齐(Alig ...

  2. 关于共用体所占的内存空间的问题

    共用体 `共用体(联合)` 共用体类型变量的定义 共用体变量的引用方式 共用体类型数据的特点 [例1]分析程序运行结果 [实训内容3]输入并运行以下程序,从输出的结果体会"共用"的 ...

  3. 100*100的 canvas 占多少内存?

    题目 100*100的 canvas 占多少内存? 在 三年前端,面试思考 中提到了一个题目,非常有新意,这里分享一下当时面试的思考过程. 解题思路 其实真正的答案是多少我并不清楚,面试过程中面试官也 ...

  4. [html] 请问60*80的canvas占多少内存?你是怎么计算的?

    [html] 请问60*80的canvas占多少内存?你是怎么计算的? 一个像素为1byte,通过getImageData方法可以得到canvas的二进制流 个人简介 我是歌谣,欢迎和大家一起交流前后 ...

  5. 这4个小程序为什么有很多人在用,仅仅是因为不占手机内存空间?

    现在小程序真是无处不在,各种类型的都有,小程序是很多没错,那APP也很多,为什么使用小程序的人越来越多,难道就难道仅仅是因为不占手机内存空间吗?原来不是,是因为下面这个4款小程序真的很实用. 1.小橘 ...

  6. 为什么一个盘里的文件夹都不见了,里面一片空白,但那些文件所占的内存却还在的,但好像没被删除

    硬盘空间占用但没文件,硬盘空间占用但文件消失了为什么一个盘里的文件夹都不见了,里面一片空白,但那些文件所占的内存却还在的,但好像没被删除 工具/软件:AornData软件 步骤1:先百度搜索并下载程序 ...

  7. 照片别放在手机相册了!跟我学,放这4处地方安全又不占手机内存

    你喜欢拍照吗?你有没有觉得照片放在手机相册里,既占内存又不太安全? 作为一名拍过5W张照片的摄影爱好者,我的照片从来都不放在手机相册里,不然就太对不起我的16G乞丐版了! 那照片放哪既安全又不占手机内 ...

  8. 计算机病毒占内存吗,蠕虫病毒占多少内存

    蠕虫病毒通常会感染Windows 2000/ XP/Server 2003系统,如果不及时预防,它们就可能会在几天内快速传播.大规模感染网络,对网络安全造成严重危害.蠕虫病毒会占用计算机内存,那么,蠕 ...

  9. android 内存占用60m,占60M内存的吃鸡

    占60M内存的吃鸡是一款卡通像素风格的休闲向枪战游戏,游戏采用的是2.5D视角,这里炫酷的技能伴随着欢乐无限的射击,你还可以和自己的朋友一起组队激战,痛快吃鸡.感兴趣的朋友们快来西西下载体验吧! 游戏 ...

最新文章

  1. (转)Android 常用 adb 命令总结
  2. JEPaaS笔记||学习培训资料||案例视频 【全套】
  3. Python笔记-Json转DataFrame(基金主题Json数据)
  4. Charm Bracelet(POJ-3624)
  5. Select网络模型下的简单CS实例
  6. 因为造轮子,我一个月就转正了 | 原力计划
  7. html标签非成对,深入document.write()与HTML4.01的非成对标签的详解
  8. yii第三方插件snoopy配置
  9. iTween的用法总结
  10. Django order by 高级用法
  11. 智慧工厂是什么 智慧工厂方案举例 智慧工厂案例
  12. 豆瓣高分JAVA书籍,值得收藏
  13. 关于面试的方法和技巧都有哪些呢?
  14. #小何不断努力#8.18
  15. contentprovider与resolver使用
  16. (dedecms)织梦搬家后无法更新栏目
  17. c语言求n个数最大最小值,c语言 如何求n个数的最大值 最小值
  18. 8051单片机的存储器结构
  19. more命令的基本实现
  20. 64位字长的高性能微型计算机,地址总线字长内存容量寻址范围之间的计算

热门文章

  1. 浅谈面试中常提到的乐观锁与悲观锁
  2. 7.Android常用第三方支付
  3. 28岁程序员从字节退休:IT是改命的唯一出路吗?
  4. kettle6.0 连接oracle11g,Kettle表输出报关闭的连接问题的解决方法
  5. Java云同桌学习系列(十五)——MySQL数据库
  6. 微信小程序开发学习记录(一):直播功能
  7. vue2.0 使用xlsx读取excel文件数据 操作流程 以及文件中特殊日期数据的处理
  8. MATLAB之绘图基础
  9. AutoSAR系列讲解(实践篇)7.1-DaVinci Developer使用初探
  10. 量化投资学习——经济周期