龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

关于内存对齐[组图](2)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
程序执行结果为 8 ( sizeof( int ) + sizeof( char ) + sizeof( char ) + 对齐值 )为8. (我的机子是32 位,4*2=8)一切都是编译器搞得自已头晕,但是为什么以前自已写的网 络

  程序执行结果为 8 ( sizeof( int ) + sizeof( char ) + sizeof( char ) + 对齐值 )为8. (我的机子是32 位,4*2=8)一切都是编译器搞得自已头晕,但是为什么以前自已写的网 络程序没有这种情况?同样的数据包传输,我并没有阻 止编译进行强制对齐,我猜可能是操作系统都是一样(都是WinX系统)的才 没有出现问题,而现在的网络视频板是内嵌式linux,对 数据包的处理是纯数据(不经对齐的数据)是敏感的所以,才会出现这样 的问题! 这种情的解决方法是阻止编译器对数据包对齐,因为数 据对齐的时候,编译器会塞入一些没有意义的数据对结 构进行对齐,使用 #pragma 强制编译器产生指定数据对齐方式,如下代码 所示

#pragma pack(push)
#pragma pack(1)
typedef struct tagPACKAGE {
  int   intValue;
  char  chValue1;
  char  chValue2;
} PACKAGE, * LP_PACKAGE;
#pragma pack(pop)
typedef struct tagPACKAGE2 {
  int   intValue;
  char  chValue1;
  char  chValue2;
} PACKAGE2, * LP_PACKAGE2;
int main()
{
  PACKAGE package;
  PACKAGE2 package2;
  
  std::cout << "sizeof( package ) = " <<
sizeof( package ) << std::endl;
  std::cout << "sizeof( package2 ) = " <<
sizeof( package2 ) << std::endl;
  return 0;  
}

  对指定的数据包编译时进行内存对齐,这样,也不会对 编译对其数据进行优化!

  总结:

  C++的编译器总是在背后做了很多事!网络数据处理或 与内嵌式设备打交道的时候,这更应该小心!

精彩图集

赞助商链接