这几天在看王艳平的《windows 程序设计》,第5章讲解了MFC框架是怎么管理窗口句柄到窗口实例之间的映射,用到了两个类CPlex和CMapPtrToPtr,用于管理内存分配的类(避免因为大量地、频繁地创建窗口对象导致内存碎片的产生)。CMapPtrToPtr类用到了关联结构体

CAssoc,其中有好多对指针类型的转换,感觉对结构体了解不够。特别是成员的对齐方式,跟我猜测的完全不同,花了点时间搞清楚了。在跟朋友一起吃饭还有时间,就顺手写下来,供大家参考:

首先明白几个概念:

1、结构体成员的对齐字节数:可以是n=(1,2,4,8,16);VC编译器默认是8,可以打开工程设置->C/C++->Code Generation,可以看到Struct Member Alignment的值为8;

2、成员所占内存空间的字节数,sizeof(int) = 4,sizeof(short)=2; 设每个成员的内存字节数为:Len

3、成员的偏移字节数,相对于结构体的首地址;

接下来有3条规则:

1、结构体变量的起始地址,也就是第一个成员的地址:为Max(Len) 的整数倍;

2、每个成员的偏移量为:Min(n,Len) 的整数倍;

3、整个结构体占用的空间为:Min( n,Max(Len) ) 的整数倍;

下面看两个例子:

 1 #include <iomanip>
 2 #include <iostream>
 3 using namespace std;
 4
 5 #pragma pack(push)
 6 #pragma pack(2)  //设置默认对齐字节数
 7 struct MyInfo
 8 {
 9
10     char age;
11     int sn;
12     char sex;
13 };
14 #pragma pack(pop)
15
16 int main(int argc, char* argv[])
17 {
18     MyInfo na;
19     cout<<setw(10)<<"&na.age:"<<(void*)&na.age<<endl;
20     cout<<setw(10)<<"&na.sn:"<<(void*)&na.sn<<endl;
21     cout<<setw(10)<<"&na.sex:"<<(void*)&na.sex<<endl;
22     cout<<setw(10)<<"sizeof(na):"<<sizeof(na)<<endl;
23     return 0;
24 }

规则1,2,3均符合:首地址是4的整数倍;第二个成员偏移量为:Min(2,4) = 2的整数倍;总长度为8,是Min( 2,Max(Len) ) = 4的整数倍,第三个成员后有1 Byte的填充。

结果为:

 1 #include <iomanip>
 2 #include <iostream>
 3 using namespace std;
 4
 5 #pragma pack(push)
 6 #pragma pack(8)  //设置默认对齐字节数
 7 struct MyInfo
 8 {
 9
10     char age;
11     int sn;
12     char sex;
13 };
14 #pragma pack(pop)
15
16 int main(int argc, char* argv[])
17 {
18     MyInfo na;
19     cout<<setw(10)<<"&na.age:"<<(void*)&na.age<<endl;
20     cout<<setw(10)<<"&na.sn:"<<(void*)&na.sn<<endl;
21     cout<<setw(10)<<"&na.sex:"<<(void*)&na.sex<<endl;
22     cout<<setw(10)<<"sizeof(na):"<<sizeof(na)<<endl;
23     return 0;
24 }

转载地址:http://www.cnblogs.com/mm220284/archive/2013/09/21/3332181.html

转载于:https://www.cnblogs.com/stemon/p/3393718.html

C/C++ 结构体成员在内存中的对齐规则(转载)相关推荐

  1. C语言小记:结构体及其在内存中的储存形式

    C语言小记:结构体及其在内存中的储存形式 1.结构体 结构体的作用:自定义一个包含多种不同数据类型的变量. 语法: struct 结构体名称 {结构体成员1:结构体成员2:结构体成员3:... } 定 ...

  2. 结构体在内存中的对齐规则

    一个结构体变量定义完之后,其在内存中的存储并不等于其所包含元素的宽度之和. 例一: #include <iostream> using namespace std; struct X { ...

  3. 通过宏函数计算结构体成员偏移量

      编译器在为结构体成员分配内存时,由于存在内存对齐机制,各个成员所占空间可能不是连续的,因而不能简单的通过成员类型所占的字长来推断其它成员或结构体对象的地址.   获得结构体成员偏移量的方法可以参照 ...

  4. C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?

    C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题? 问题1:结构体指针最开始怎么分配内存?用sizeof()是不能确定大小的. 问题2:给结构体变量分配之后,是否还要 ...

  5. 【Linux 内核 内存管理】内存映射相关数据结构 ③ ( vm_area_struct 结构体成员分析 | shared 成员 | anon_vma_chain 成员 | anon_vma 成员 )

    文章目录 一.vm_area_struct 结构体成员分析 1.shared 成员 2.anon_vma_chain 成员 3.anon_vma 成员 二.vm_area_struct 结构体完整源码 ...

  6. C语言:指针的偏移步长、结构体成员的偏移量、嵌套结构体成员的偏移量、结构体的内存对齐

    文章目录 1 不同类型指针的偏移步长 2 结构体成员的偏移量 3 嵌套结构体成员的偏移量 4 结构体的内存对齐 4.1 内存对齐的原因与优点 4.2 结构体内存对齐的规则 4.3 结构体嵌套结构体时的 ...

  7. 【Linux 内核 内存管理】memblock 分配器 ③ ( memblock_region 内存块区域 | memblock_region 结构体成员分析 | memblock 分配器标志位 )

    文章目录 一.memblock_region 内存块区域 二.memblock_region 结构体成员分析 1.base 成员 2.size 成员 3.flags 成员 4.nid 成员 三.mem ...

  8. c语言结构体成员变量私有化,C语言中结构体变量私有化详解

    C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...

  9. C/C++ 中访问结构体成员的方法

    先看例子:  1#include <stdio.h> 2void main(){ 3    typedef struct {     4     int int_field;      5 ...

最新文章

  1. Linux的fork实现原理,【Linux】Fork炸弹详解
  2. xshell / xftp家庭/学校免费版官网下载地址
  3. 在HTML中,如何设置新窗口打开和在原窗口打开
  4. 客座编辑:谢波峰(1976-),男,中国人民大学财政金融学院副教授,中国人民大学金融与财税电子化研究所执行所长。...
  5. Qt笔记-Q_UNUSED解决编译器unused paramenter告警
  6. 什么是 XDoclet?
  7. 华为鸿蒙系统英语报纸_华为鸿蒙英文不是Hongmeng OS?余承东解释
  8. 数字签名和加密的基本原理及其区别?
  9. 技能竞赛国赛_中西部第一!技能“川军”在第一届全国技能大赛斩获4金5银6铜...
  10. linux错误—3.解决设置普通用户的sudo权限中碰到的问题:sudo: /etc/sudoers is world writable...
  11. HDU 4122:Alice's mooncake shop RMQ(2011 Asia Fuzhou Regional Contest )
  12. 将一个CSV格式的文件分割成两个CSV文件
  13. diybox路由器设置教程_图文教程:家用无线路由器设置 | 192路由网
  14. 《时间的秩序》-- 卡洛.罗韦利
  15. 华为鸿蒙OS摄像头,首款华为鸿蒙OS摄像头开售:分布式看家新神器 无需SD卡
  16. 调用方法[manageApp]时发生异常 java.lang.IllegalStateException: 启动子级时出错
  17. 将边缘云装进胶囊数据中心需要几步?
  18. C#通信,结构体和byte数组互转
  19. 最经典的LOGO设计如何返璞归真
  20. 四川大学华西医院“大数据集成及应用平台”项目 市场调研

热门文章

  1. android toolbar区别,Android《ToolBar》
  2. Java高并发编程详解系列-Future设计模式
  3. linux行位换行符,换行符或标点符号作为elasticsearch中的位置间隔
  4. Linux下使用fstatfs/statfs查询系统相关信息
  5. activity6快速部署流程文件
  6. python入门系列:函数
  7. HAOI2018游记
  8. 无法添加 WebEx 扩展插件。请重试。
  9. 【读书札记】《怦然心动——情感化交互设计指南》
  10. Android之launchMode总结