博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++ 结构体成员在内存中的对齐规则(转载)
阅读量:6524 次
发布时间:2019-06-24

本文共 1439 字,大约阅读时间需要 4 分钟。

这几天在看王艳平的《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 
2 #include
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<
<<"&na.age:"<<(void*)&na.age<

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

结果为:

1 #include 
2 #include
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<
<<"&na.age:"<<(void*)&na.age<

转载地址:

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

你可能感兴趣的文章
NBU异构还原Oracle完整备份的一些总结
查看>>
freeBSD安装详细讲解
查看>>
WSFC2016 VM弹性与存储容错
查看>>
文档管理,文本编辑控件TX Text Control .NET for WPF
查看>>
复习 Python 匿名函数 内建函数
查看>>
Security Identifiers | Win SRV2016 SID Change 修改
查看>>
看看来自日本的扫描,做网站需要注意的
查看>>
JDK 1.7+Android SDK+IntelliJ IDEA 13+Genymotion 安卓开发环境部署
查看>>
钓鱼邮件***防范指南
查看>>
session_start()放置位置的不正确引发的ROOT常量 未定义的错误
查看>>
如何设定VDP同时备份的任务数?
查看>>
ipsec的***在企业网中的经典应用
查看>>
过来人谈《去360还是留在百度?》
查看>>
mysql备份工具innobackupex,xtrabackup-2.1安装,参数详解
查看>>
【复制】slave筛选复制之二(create/drop table语句)
查看>>
Movie Store OpenCart 自适应主题模板 ABC-0249
查看>>
mytop-MySQL监控工具
查看>>
RedHat linux YUM本地制作源
查看>>
apache端口占用问题
查看>>
本地Office Project计划表同步到SharePoint2013任务列表的权限问题
查看>>