关于内存对齐2011-02-07 vckbase 赖锋曾经接手一个网络视频监控程序,主要是上层软件通过 发送控制指令获取网络视频板的视频数据和控制网络 视频板, 这应该是一个比较简单的流程!一切的开发都很顺利,测试的时候,问题就来了,获取视 频数据流的数据竟然是错误的,我糊涂了,把整个程序 流程,用调试器一步一步地跑,到了发送视频指令的时候,返回 指令操作错误的结果,怎么回事?我是按照视频的操作指令封装的数据包,内存显示数据 包的内容是没有错误的,就是一个晚上,我不停地找"错 误",只有偶然,我把sizeof()这个指令直接换掉,把数据包全 部用一个BYTE的数据进行copy,程序成功执行!这时,我 已经快晕了!数据发送到网络板的数据包大小根本不是实际控制数 据包的大小!这时我才想起一个人, Stanley B. Lippman,他写的那 一本书 "Inside object modale", 曾经提过这样的事 情,编译器为了提高CPU的效率,会对struct 的结构进行优化, 利用sizeof 可以得出不同的计算机上对 struct 的结 构优化后的大小值.以前是看过,但是,却没有深刻理会,现在,吃了 苦头,才明白!这是我的理解,C++ 编译器为了使CPU的性能达到最佳, 会对 struct 的内存结构进行优化,这是为了达到CPU 数据传输总线的吞吐值,各个计算机的数据传输总线是不一样的, 如32位的计算机的数据传输值是4 bytes,64位计算机 数据传输是 8 bytes,这样,struct 在默认的情况上,编译器会对 struct 的结构进行数据对齐((32位机)4的倍数或(64 位机)8的倍数),如下面这段代码所示:
#include
typedef struct tagPACKAGE {
int intValue;
char chValue1;
char chValue2;
} PACKAGE, * LP_PACKAGE;
int main()
{
PACKAGE package;
std::cout << "sizeof( package ) = " <<
sizeof( package ) << std::endl;
return 0;
}