繁体   English   中英

MSVC:什么编译器开关会影响结构的大小?

[英]MSVC: what compiler switches affect the size of structs?

我有两个单独编译的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,而在另一个dll中它是48。
两个dll都是x64。

好的,所以这可能是有史以来最晦涩的事情。
事实证明,matlab将/D_SECURE_SCL=0添加到编译中,该编译禁用了一个名为'secure iterators'的东西
这反过来导致std::vector大小相差16个字节

  • 检查包含和库路径的差异
  • 检查已定义的预处理器符号的差异
  • 检查项目设置的任何差异(代码生成,链接等)
  • 在同一台机器上使用相同的IDE编译两个版本?

目标平台(例如32位与64位)同样/ Zp可以被#pragma语句覆盖。 如果使用指向结构中成员的指针,/ vm? 选项影响其大小。

类型定义可能受不同文件#included的影响。

我想不出别的什么(都不太可能)。

如果你发布结构声明,它可能会有所帮助。 您还可以在各个元素上使用OFFSETOF宏和sizeof()来详细探索差异。

构建一个或另一个库时,可能会使用#pragma pack ,它可能会改变结构的大小,而与编译器命令行上的任何内容无关。

另一个可能导致大小差异的事情是,如果结构声明中使用的任何typedef可能使用条件编译定义为一种类型或另一种类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM