C++开发之---内存对齐
网络数据协议的定义:
struct tagInfo
{
WORD wDataSize; //数据大小
BYTE cbCheckCode; //检验码
};
WORD为两个字节,BYTE是一个字节,但是sizeof(tagInfo)大小却是4
#pragma once
#pragma pack(1) //设置1字节对齐
struct tagInfo
{
WORD wDataSize; //数据大小
BYTE cbCheckCode; //检验码
};
#pragma pack() //取消设置
在头文件的开头和结尾处分别设置,然后sizeof(tagInfo)的大小就为3了。 下面摘自网络: 内存对齐的原则以及作用?
- 结构体内的成员按自身长度自对齐(32位机器上,如char=1,short=2,int=4,double=8),所谓自对齐是指该成员的起始地址必须是它自身长度的整数倍。如int只能以0,4,8这类地址开始。
- 结构体的总大小为结构体的有效对齐值的整数倍(默认以结构体中最长的成员长度为有效值的整数倍,当用#pragrma pack(n)指定时,以n和结构体中最长的成员的长度中较小者为其值)。即sizeof的值,必须是其内部最大成员的整数倍,不足的要补齐。
例如:
class A
{
char c;
int a;
char d;
};
cout << sizeof(A) << endl;
class B
{
char c;
char d;
int a;
};
cout << sizeof(B) << endl;
sizeof(A)=12,sizeof(B)=8; 因为左边是1+(3)+4+1+(3)=12,而右边是1+1+(2)+4=8。括号中为补齐的字节。
内存对齐的作用:
1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、性能原因:经过内存对齐后,CPU的内存访问速度大大提升。
QQ群:239759131 cocos 技术交流 欢迎您
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 xue_huashan@163.com
文章标题:C++开发之---内存对齐
文章字数:459
本文作者:max-xue
发布时间:2018-08-29, 18:37:40
最后更新:2019-11-09, 21:13:30
原始链接:http://blog.le-more.com/2018/08/29/c++/c-e5-86-85-e5-ad-98-e5/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。