Archive

Archive for February, 2012

一个与字节对齐有关的错误(member align)

February 16th, 2012 No comments

   在C/C++里面字节对齐在大部分时候都不需要被考虑进来,编译器会使用缺省的对齐大小对代码进行编译。但是如果遇到某些特殊的地方,就需要指定编译器用什么大小进行字节对齐。例如,以一个字节大小进行对齐。  

  而最近在一个项目中则遇到了与字节对齐有点关系的一个很奇怪的bug。故事大致如下:

在项目赶工的过程中,对一个半成品的程序大致的调试了一下,看看大致的流程是否可以跑通。不过这一试不要紧,却发现了一个很严重的问题。程序一定会crash, 调试的时候发现一个class instance的this居然是0x00000001,这个也太妖了。这个instance被new出来以后没有做过什么特别的操作。我实在是没有搞懂为何会出现这种诡异的问题。后来检查代码的时候发现有一个消息解析类的头文件里面使用了

#pragma pack(1),但是很郁闷的发现该头文件里面并没有使用#pragma pack()。我猜想大概程序出错和这个问题有关。在头文件尾部添加了#pragma pack()以后测试程序就一切正常了。

再后来,我自己做了一个小的测试程序,想模拟一下这种#pragma pack()没有配对的情况对程序的影响,去发现无法正常模拟出这个情况。但是在模拟过程中却发现在VS里面编译时会出现warning:

1>.align.cpp(10) : warning C4103: ‘e:worktestalignalign.cpp’ : alignment changed after including header, may be due to missing #pragma pack(pop)

不过为何在项目程序的编译的时候不会出现这个warning呢(setting里面没有什么特殊的配置禁掉某些warning或者error)

Categories: programming Tags: