我正在處理一些需要大量內存的應用程序。爲了減少內存使用量,我將大對齊結構切換爲1字節(#pragma pack(1))。 之後,我的結構體積縮小了10-15%左右,但出現了一些問題。 當我嘗試通過指針或引用應用程序使用我的結構中的某個字段時,只會崩潰。如果我直接更改字段,它工作正常。C++ struct aligment爲1字節導致WinCE崩潰
在測試應用程序中,我發現問題在結構中使用小於4字節的字段後開始出現。
測試代碼:
#pragma pack(1)
struct TestStruct
{
struct
{
long long lLongLong;
long lLong;
//bool lBool; // << if uncommented than crash
//short lShort; // << if uncommented than crash
//char lChar; // << if uncommented than crash
//unsigned char lUChar; // << if uncommented than crash
//byte lByte; // << if uncommented than crash
__int64 lInt64;
unsigned int Int;
unsigned int Int2;
} General;
};
struct TestStruct1
{
TestStruct lT[5];
};
#pragma pack()
void TestFunct(unsigned int &pNewLength)
{
std::cout << pNewLength << std::endl;
std::cout << "pNL pointer: " << &pNewLength << std::endl;
pNewLength = 7; // << crash
char *lPointer = (char *)&pNewLength;
*lPointer = 0x32; // << or crash here
}
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << sizeof(TestStruct1) << std::endl;
TestStruct1 *lTest = new TestStruct1();
TestFunct(lTest->lT[4].General.Int);
std::cout << lTest->lT[4].General.Int << std::endl;
char lChar;
std::cin >> lChar;
return 0;
}
編譯ARM的代碼(WinCE的6.0)導致崩潰。 Windows x86上的相同代碼可以正常工作。更換包裝(1)以包裝(4)或僅包裝()可解決此問題,但結構較大。
爲什麼這種對齊會導致問題?
您是否試過訂購從大到小的會員?這是否有所作爲? –
確實有幫助,但是在不同級別的嵌套結構上添加新的小字段會再次造成問題。 (1)很難管理多層次結構。 – sebeksd