VC++中内存对齐实例教程
内存对其是VC++程序设计中一个非常重要的技巧,本文即以实例讲述VC++实现内存对其的方法。具体分析如下:
一、概述
我们经常看到求 sizeof(A) 的值的问题,其中A是一个结构体,类,或者联合体。
为了优化CPU访问和优化内存,减少内存碎片,编译器对内存对齐制定了一些规则。但是,不同的编译器可能有不同的实现,本文只针对VC++编译器,这里使用的IDE是VS2012。
#pragma pack()是一个预处理,表示内存对齐。布局控制#pragma,为编译程序提供非常规的控制流信息。
二、结构体的大小的规则
结构体大小是处理器位数和结构体内最长数据元素所占字节数二者中较小的那一个的整数倍。
比如说,假设处理器位数为n,结构体内最大数据元素所占字节数为m。
处理器为32位,n = 4;结构体内最大数据类型为short,m = 2; n > m;结构体大小为m的整数倍,反之亦然。
注意:有些虽然是64位的操作系统,但是编译器却是32位的,此时位数为32.
class A{ int a; char b; short c; }; sizeof(A)为8,为4的整数倍。 struct B{ short a; short b; short c; };
sizeof(B)为6,为2(sizeof(short))的整数倍。
注意:C++中的结构体与类只有一个区别,就是结构体成员默认是public,而类默认是private。
class X{ public: double a; float b; int c; char d; };
sizeof(X)为20,为4(处理器位数)的整数倍。
三、#pragma pack(n)
#pragma pack(n)中的n默认是4,即处理器位数32,但我们可以自己定义它的大小。
#pragma pack(1) class A{ public: int a; char b; short c; };
此时sizeof(A)为7,为1(#pragma pack(1))的整数倍。
#pragma pack(1) class X{ public: double a; int b; short c; char d; };
sizeof(X)为15,为1(#pragma pack(1))的整数倍。
#pragma pack(4) class X{ public: double a; int b; short c; char d; };
sizeof(X)为16,为4(#pragma pack(4))的整数倍。
#pragma pack(8) class X{ public: double a; int b; short c; char d; };
sizeof(X)为16,为8(#pragma pack(8) 或者 sizeof(double))的整数倍。
四、内存对齐
结构体中数据元素所在内存地址由两个因素决定。
一是#pragma pack(n) 中的n,二是元素类型所占字节数,sizeof(type),两者中取较小的一个,元素内存地址到结构体或类的起始地址的偏移量为较小数的整数倍。
比如#pragma pack(n)默认为4,有以下结构体
struct A{ int a; char b; short c; };
a的起始地址距离结构体起始地址的偏移量为0,是sizeof(int)的整数倍。
b的起始地址距离结构体起始地址的偏移量为4,是sizeof(char)的整数倍。
c的起始地址距离结构体起始地址的偏移量为5,不是sizeof(short)的整数倍,所以它的起始地址偏移量将会是6,而不是5。
输出a, b, c 的地址为
0043FD68
0043FD6C
0043FD6E
可以看到c的起始地址比b的起始地址大了2个字节,b占了2个字节的大小,这是因为c的类型是short型,大小为2,而n默认是4,sizeof(short) < n,所以偏移量应该是2的整数倍,这里是6.
希望本文所述对大家的VC++程序设计有所帮助。
相关文章
VC++ loadlibrary()加载三方dll失败, 返回错误码:126的解决方法
今天在编写VC++ loadlibrary()加载三方dll是总是失败,并且返回错误码:126,这里就为大家分享一下具体的解决方法...2021-03-15- 这篇文章主要介绍了VC++实现选择排序算法简单示例,代码简洁易懂,有助于读者对数据结构与算法的学习,需要的朋友可以参考下...2020-04-25
VC++中HTControl控制类使用之CHTDlgBase对话框基类实例
这篇文章主要介绍了VC++中HTControl控制类使用之CHTDlgBase对话框基类,是比较丰富而实用的功能,需要的朋友可以参考下...2020-04-25- 这篇文章主要介绍了VC++的if语句应用范围分析,对VC++初学者有很好的参考学习价值,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了Vc++ 控件List Control用法总结的相关资料,需要的朋友可以参考下...2020-04-25
- 在掌握基本的结构体使用后,我们在面试和大型比赛中常常会遇到一个热门考点:结构体内存对齐,也就是计算结构体大小。接下来请跟着笔者一起来学习这块知识点吧...2021-10-23
- 这篇文章主要介绍了VC++ 中ListCtrl经验总结的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了VC++进度条process Bar的用法,是进行VC++应用程序开发中非常常见的实用技巧,需要的朋友可以参考下...2020-04-25
- 这篇文章主要为大家介绍了VC++ 6.0 C语言实现俄罗斯方块详细教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
VC++中HTControl的CHTButton按钮控件类用法实例解析
这篇文章主要介绍了VC++中HTControl的CHTButton按钮控件类用法,对于大家进行VC++项目开发有一定的帮助作用,需要的朋友可以参考下...2020-04-25- 这篇文章主要介绍了VC++基于Dx实现的截图程序示例代码,比较实用的功能,需要的朋友可以参考下...2020-04-25
- 本篇文章是对内存对齐进行了详细的分析介绍,需要的朋友参考下...2020-04-25
解析内存对齐 Data alignment: Straighten up and fly right的详解
对于所有直接操作内存的程序员来说,数据对齐都是很重要的问题.数据对齐对你的程序的表现甚至能否正常运行都会产生影响...2020-04-25- 这篇文章主要介绍了VC++实现文件与应用程序关联的方法,涉及VC++针对注册表的相关操作技巧,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了VC++创建msi文件的方法,对于应用程序的开发有一定的借鉴价值,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了VC++角色游戏中的人物初始化模块,对大家学习VC++有一定的帮助,需要的朋友可以参考下...2020-04-25
VC++实现CStdioFile写入及读取文件并自动换行的方法
这篇文章主要介绍了VC++实现CStdioFile写入及读取文件并自动换行的方法,很实用的功能,需要的朋友可以参考下...2020-04-25- C语言结构体对齐也是老生常谈的话题了,基本上是面试题的必考题,这篇文章主要给大家介绍了关于C语言中结构体与内存对齐的相关资料,需要的朋友可以参考下...2021-07-19
- 这篇文章主要为大家详细介绍了DEVC++实现推箱子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 本文给大家汇总介绍了5种VC++中获取系统时间的方法,十分的简单实用,有需要的小伙伴可以参考下。...2020-04-25