有一个非常微妙的问题。 有一个用MS VS 2013 c ++编译器编译的类,32位平台的大小为4个字节。函数指针的大小为4个字节。但是当这个类用同样的编译器编译但包含在不同的项目中来生成库时,也就是针对32位平台,那么类有* m_Function指针占用16个字节!当然,当我从主项目中实例化这个类时,它认为该类占用4个字节并分配这个非常大的内存大小,而实际上它占用16个字节并导致内存溢出。
class CC1
{
public:
CC1();
void (CC1:: *m_Function) ();
};
我知道指向成员函数的大小可能会有所不同。但qustion是 - 哪个编译器设置控制这个?我不在乎它是4或16字节 - 只需要它们是相同的。两个项目的Struct成员对齐设置相同。 / vmm / vmg选项?在两个项目的编译器设置中都没有提到它们。
顺便说一句,我尝试构建x64目标,在这种情况下,sizeof * m_Function总是8字节,来自main和libray项目。
谢谢。
答案 0 :(得分:5)
See here for docs page for /vm options
如果你使用'/ vmg'编译器选项,那么指向成员的函数总是16字节,因为你有效地告诉编译器它可能事先不知道大小,所以必须假设最坏(虚拟)继承!)。
如果使用'/ vmb',那么编译器必须在使用之前知道struct的继承模式,因此可以使用最有效的方法 - 在简单继承的情况下,这是4个字节。
很可能在某些项目中你设置了'/ vmg'(这使得类为16字节)而在其他项目中你没有(这使得类4字节)。
/ vmb是隐式默认值 - 检查编译器命令行以查找此类为16位字节的库/ vmg