C/C++ 结构体成员在内存中的对齐规则
这几天在看王艳平的《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) ) 的整数倍;
下面看两个例子:
#include <iomanip>
#include <iostream>
using namespace std; #pragma pack(push)
#pragma pack(2) //设置默认对齐字节数
struct MyInfo
{ char age;
int sn;
char sex;
};
#pragma pack(pop) int main(int argc, char* argv[])
{
MyInfo na;
cout<<setw()<<"&na.age:"<<(void*)&na.age<<endl;
cout<<setw()<<"&na.sn:"<<(void*)&na.sn<<endl;
cout<<setw()<<"&na.sex:"<<(void*)&na.sex<<endl;
cout<<setw()<<"sizeof(na):"<<sizeof(na)<<endl;
return ;
}
规则1,2,3均符合:首地址是4的整数倍;第二个成员偏移量为:Min(2,4) = 2的整数倍;总长度为8,是Min( 2,Max(Len) ) = 4的整数倍,第三个成员后有1 Byte的填充。
结果为:

#include <iomanip>
#include <iostream>
using namespace std; #pragma pack(push)
#pragma pack(8) //设置默认对齐字节数
struct MyInfo
{ char age;
int sn;
char sex;
};
#pragma pack(pop) int main(int argc, char* argv[])
{
MyInfo na;
cout<<setw()<<"&na.age:"<<(void*)&na.age<<endl;
cout<<setw()<<"&na.sn:"<<(void*)&na.sn<<endl;
cout<<setw()<<"&na.sex:"<<(void*)&na.sex<<endl;
cout<<setw()<<"sizeof(na):"<<sizeof(na)<<endl;
return ;
}



C/C++ 结构体成员在内存中的对齐规则的更多相关文章
- C/C++ 结构体成员在内存中的对齐规则(转载)
这几天在看王艳平的<windows 程序设计>,第5章讲解了MFC框架是怎么管理窗口句柄到窗口实例之间的映射,用到了两个类CPlex和CMapPtrToPtr,用于管理内存分配的类(避免因 ...
- C/C++编程笔记:C语言对齐问题【结构体、栈内存以及位域对齐】
引言 考虑下面的结构体定义: 假设这个结构体的成员在内存中是紧凑排列的,且c1的起始地址是0,则s的地址就是1,c2的地址是3,i的地址是4. 现在,我们编写一个简单的程序: 运行后输出: 为什么会这 ...
- 关于C语言中结构体中的结构体成员导致的字节对齐问题
关于结构体的字节对齐是什么,就不赘述,再此附上一篇文章,介绍字节对齐:http://www.linuxsong.org/2010/09/c-byte-alignment/ 这里的结构体字节对齐的数据类 ...
- C++中的结构体所占内存空间总结
因为结构体有时候需要字节对齐.一般而言,struct 的 sizeof 是所有成员字节对齐后长度相加,而 union 的 sizeof 是取最大的成员长度. 在默认情况下,编译器为每一个变量或数据单元 ...
- C语言中访问结构体成员时用‘.’和‘->’的区别
举个例子,定义了一个叫Student,别名为stu的结构类型,我们声明了一个结构体变量叫stu1,声明了一个结构体指针为stuP. typedef struct Student { char name ...
- C++类成员在内存中的存储及对齐方式
前言:数据对齐的基本理论参见文章:http://www.cnblogs.com/MyBlog-Richard/articles/5993448.html 一.空类的大小 C++中空类的大小是1,这是因 ...
- 指针直接赋值为整型AND利用宏定义求结构体成员偏移量
首先我们要更正一个很熟悉的概念,那就是指针不仅仅是“地址”,指针还有一个很重要的特性,那就是“类型”. 指针初始化时,“=”的右操作数; 除外,该语句表示指针为空): 所以 ; 这样的代码是不允许的. ...
- FFmpeg源代码简单分析:结构体成员管理系统-AVOption
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- FFmpeg源代码简单分析:结构体成员管理系统-AVClass
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
随机推荐
- 柯南君:看大数据时代下的IT架构(2)消息队列之RabbitMQ-基础概念详细介绍
一.基础概念详细介绍 1.引言 你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用.通讯的问题而苦恼.挣扎?如果是,那么恭喜你,消息服务让你可以很轻松 ...
- 自定义UITextField(UITextField重写)
// CustomField.h #import <UIKit/UIKit.h> @interface CustomField : UITextField @end // CustomFi ...
- [Android]The connection to adb is down, and a severe error has occured.
在Android开发时,有时我们开启虚拟机执行程序时.会报类似下面错误: [2015-07-19 15:08:29 - TestXiaoYanLibrary] The connection to ad ...
- hdu1114Piggy-Bank(DP完全背包)
题意:在ACM可以做任何事情,必须准备和预算获得必要的财政支持.这次行动的主要收入来自不可逆绑定金钱(IBM).背后的想法很简单.每当一些ACM成员有任何小的钱,他把所有的硬币和成小猪银行抛出.你知道 ...
- Objective C 链式调用
起因 某日使用DKChainableAnimationKit的时候发现可以如下写代码: view.animation.rotate(180).anchorTopLeft.thenAfter(1.0). ...
- Filter及FilterChain的使用具体解释
一.Filter的介绍及使用 什么是过滤器? 与Servlet类似,过滤器是一些web应用程序组件,能够绑定到一个web应用程序中.可是与其它web应用程序组件不同的是,过滤器是"链&quo ...
- mywebsite1
http://www.wuweierwei.com/ 个人网站 http://www.yyyweb.com/demo/icons-filling/index.html CSS3图标填充效果 http: ...
- vs2012C#编程环境设置智能提示
vs2012 智能提示和 显示行号的问题 路径为 菜单里 工具-->选项-->文本编辑器-->C# 如图所示 自动列出成员就是 vs里面的智能提示 行号就会显示所写代码的行 ...
- BZOJ 3870: Our happy ending( 状压dp )
dp(i, s)表示考虑了前i个数后, 能取到的数的集合为s时的方案数.对于1~min(L, K)枚举更新, 剩下的直接乘就好了. 复杂度O(T*K*2^N)...好像有点大, 但是可以AC.... ...
- BZOJ 1297: [SCOI2009]迷路( dp + 矩阵快速幂 )
递推式很明显...但是要做矩阵乘法就得拆点..我一开始很脑残地对于每一条权值v>1的边都新建v-1个节点去转移...然后就TLE了...把每个点拆成9个就可以了...时间复杂度O((9N)^3* ...