关于内存对齐[组图]
曾经接手一个网络视频监控程序,主要是上层软件通过 发送控制指令获取网络视频板的视频数据和控制网络 视频板, 这应该是一个比较简单的流程!
一切的开发都很顺利,测试的时候,问题就来了,获取视 频数据流的数据竟然是错误的,我糊涂了,把整个程序 流程,用调试器一步一步地跑,到了发送视频指令的时候,返回 指令操作错误的结果,怎么回事?
我是按照视频的操作指令封装的数据包,内存显示数据 包的内容是没有错误的,就是一个晚上,我不停地找"错 误",只有偶然,我把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;
}
- 上一篇:在VC中实现全屏窗口程序
- 下一篇:用vc++对ie进行修改操作