补丁也有补出问题的时候

上一篇提到的member-function pointer的问题,后来发现并不是因为不同的编译环境造成指针大小不一样,而是因为不同的环境下结构体的对齐规则出了问题。

出问题的是vc6.0 sp5,在这个环境下,如果定义unknow type的member-function pointer,例如这样:

class Unkonw; //forward declaration

typedef void(Unkonw::* MFP)(int param);

struct Callback {

char* szName;

MFP fp; }

即使编译选项里面没有设定其他的对其规则,使用了默认的8字节对齐,这个sizeof(Callback)也是32,而不是正常的24。这个问题在原始的vc6.0里面并没有出现,打了sp5补丁才会出现。如果继续升级到sp6就修复这个问题了。所以说,真正邪恶的不是member-function pointer,而是出错的编译器才对-_-b

查问题的时候,有种很简单的输出sizeof结果的方法,可以做到编译期查看对象大小,方法是:

template<int s> class TestTSize; 

然后在需要的地方写TestSize<sizeof(xxx)>()即可在编译出错的信息里面看到求值以后的sizeof。这个技巧貌似在《Modern C++ Design》里面提到过。嗯嗯,很有用的说。

2 thoughts on “补丁也有补出问题的时候”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.