簡體   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