編譯這個頭:保證不對性病正確對準:: string的
// myheader.h
class MyClass {
MyClass();
~MyClass();
unsigned int mMyUint;
bool bMyBool;
std::string sMyString;
};
與Visual Studio 2010/W4(有人告訴我這樣做),目標64,給了我以下warning C4121
:
'MyClass' : alignment of a member was sensitive to packing
,指的是std::string sMyString
所在的行。 official help of Microsoft建議使用#pragma pack(x)
,其中x
是1,2,4依賴於在其結構/類中使用的成員。
不,我不知道哪個對齊用於std :: string?我的想法是,std :: string既不是平臺獨立的,也不是編譯器。有什麼方法可以解決這個問題,尤其是考慮到可能有其他問題的其他成員?
最好是獨立於編譯器(甚至是便攜式)的解決方案。
更新:關於jalf提供的非常有用的答案:不,在這個文件中我沒有使用#pragma pack(x)
。我在另一個結構體中使用它,在不使用#pragma pack(x)
時,我使用的位域被填充。現在我只是因爲不知道Microsoft編譯器如何解決std::string
而陷入同一陷阱而感到震驚。
它只是告訴你,有你的結構內的空間。你不應該毫無理由地打包它。重新安排成員可能會使這個愚蠢的警告消失,只是忽略它。 – PlasmaHH
Re。你的更新:嘗試將這個類定義複製到一個單獨的文件並孤立地編譯,而不包括任何不必要的東西。如果這仍然產生警告,那麼只是微軟很愚蠢。否則,它是來自其他代碼的東西(例如'#pragma pack(push)',沒有對應的'pop'。 – jalf