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