我有两个单独编译的DLL,一个是从Visual Studio 2008编译的,另一个是从matlab编译的mex文件。
这两个DLL都有一个包含的头文件。当我在一个DLL中取sizeof()
结构时它返回48,而在另一个DLL中它返回64。
我检查了/Zp
开关,并在两个编辑中将其设置为/Zp8
其他编译器切换可能会影响结构的大小?
结构是一个简单的POCO,没有继承,也没有虚函数。
修改
结构如下所示:
class LIBSPEC SGeometry
{
public:
std::vector<IGeometry> m_i;
uint N;
uint n_im, n_s;
};
在调试中,sizeof()
在两种情况下都会返回56,在发布中,在mex汇编中它是48,从VS它是64。
我可以告诉matlab在编译mex时使用的确切编译器选项,所以不是它。
修改
用offsetof检查后,发现差异在于std::vector
的大小。在一个dll中它是32而在另一个中它是48
两个dll都是x64。
答案 0 :(得分:5)
好的,所以这可能是史上最模糊的事情
事实证明,matlab将/D_SECURE_SCL=0
添加到禁用名为'secure iterators'的东西的编译中
这反过来导致std::vector
答案 1 :(得分:2)
答案 2 :(得分:1)
目标平台(例如32位与64位) 另外/ Zp可以被#pragma语句覆盖。 如果使用指向结构中成员的指针,/ vm?选项影响其大小。
类型定义可能会受到不同文件#included的影响。
我想不出任何其他事情(一切都不太可能)。
如果你发布结构声明,它可能会有所帮助。您还可以在各个元素上使用OFFSETOF宏和sizeof()来详细探索差异。
答案 3 :(得分:1)
#pragma pack
,这可能会改变结构的大小,而与编译器的命令行上的内容无关。
另一个可能导致大小差异的事情是,如果结构声明中使用的任何typedef可能使用条件编译定义为一种类型或另一种类型。