上一篇提到的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》里面提到过。嗯嗯,很有用的说。
我表示你代码里面的unknow打错了- –
我勒个去居然两个都打错了。