4

2 つの DLL を別々にコンパイルしました。1 つは Visual Studio 2008 からコンパイルされたもので、もう 1 つは matlab からコンパイルされた mex ファイルです。
どちらの DLL にも、インクルードするヘッダー ファイルがあります。1 つの DLL で構造体を取得するsizeof()と、48 が返され、もう 1 つの 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
です。mex をコンパイルするときに使用する正確なコンパイラ オプションを matlab に伝えることができるので、そうではありません。


編集

offsetof で確認したところ、違いは のサイズにあることがわかりましたstd::vector。1 つの DLL では 32 で、もう 1 つの DLL では 48
です。どちらの DLL も x64 です。

4

4 に答える 4

5

わかりました、これはおそらくこれまでで最もあいまいなものです。matlab が「セキュア イテレータ」と呼ばれるものを無効にするコンパイルに
追加することが判明しました。 これにより、サイズに 16 バイトの差が生じます。/D_SECURE_SCL=0
std::vector

于 2009-11-09T09:58:50.490 に答える
2
  • インクルード パスとライブラリ パスの違いを確認する
  • 定義されたプリプロセッサ シンボルの違いを確認する
  • プロジェクトの設定(コード生成、リンケージなど)に違いがないか確認してください。
  • 同じマシン上の同じ IDE で両方のバージョンをコンパイルしますか?
于 2009-11-09T09:43:01.727 に答える
1

ターゲット プラットフォーム (例: 32 ビットと 64 ビット) また、/Zp は #pragma ステートメントでオーバーライドできます。構造体のメンバーへのポインターを使用する場合、/vm? オプションはサイズに影響します。

タイプ定義は、#include されたさまざまなファイルの影響を受ける可能性があります。

他に考えられません(すべてかなりありそうにありません)。

構造体宣言を投稿すると、おそらく役立つでしょう。個々の要素で OFFSETOF マクロと sizeof() を使用して、違いを詳細に調べることもできます。

于 2009-11-09T09:06:05.007 に答える
1

#pragma packコンパイラのコマンドラインにあるものとは関係なく、構造体のサイズを変更する可能性のあるいずれかのライブラリが構築されるときに使用される可能性があります。

サイズの違いの原因となる可能性のあるもう 1 つのことは、構造体の宣言で使用される typedef が、条件付きコンパイルを使用して 1 つの型または別の型として定義される可能性がある場合です。

于 2009-11-09T09:06:14.087 に答える