有一个非常微妙的问题。
得到一个用 MS VS 2013 c++ 编译器编译的类,对于 32 位平台,大小为 4 个字节。函数指针的大小为 4 个字节。但是,当这个类使用相同的编译器编译但包含到不同的项目中以生成库时,也针对 32 位平台,则该类的 *m_Function 指针占用 16 个字节!当然,当我从主项目实例化此类时,它认为该类占用 4 个字节并分配这个内存大小,而实际上它占用 16 个字节并导致内存溢出。
class CC1
{
public:
CC1();
void (CC1:: *m_Function) ();
};
我知道指向成员函数的指针的大小可能会有所不同。但问题是 - 哪个编译器设置控制这个?我不在乎它是 4 个字节还是 16 个字节 - 只需要它们相同即可。两个项目的结构成员对齐设置相同。 /vmm /vmg 选项?这两个项目的编译器设置中都没有提及它们。
顺便说一句,我尝试构建 x64 目标,在这种情况下, sizeof *m_Function 始终是来自 main 和 libray 项目的 8 个字节。
谢谢。
请参阅此处了解 /vm 选项的文档页面 https://msdn.microsoft.com/en-us/library/yad46a6z.aspx
如果您使用“/vmg”编译器选项,则指向成员函数的指针将始终为 16 个字节,因为您有效地告诉编译器它可能事先不知道大小,因此必须假设最坏的情况(虚拟继承!) 。
如果您使用“/vmb”,那么编译器必须在使用之前了解该结构的继承模式,因此可以使用最有效的方法 - 在简单继承的情况下,这是 4 个字节。
很可能在某些项目中您设置了“/vmg”(这使得类为 16 字节),而在其他项目中您没有设置(这使得类为 4 字节)。
/vmb 是隐式默认值 - 检查编译器命令行中的库,其中该类的 /vmg 为 16 字节
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)