【发布时间】:2013-12-21 21:27:37
【问题描述】:
我正在开发一些需要大量内存的应用程序。为了减少内存使用,我已将大型结构的对齐方式切换为 1 字节(#pragma pack(1))。 在此之后,我的结构大小小了大约 10-15%,但出现了一些问题。 当我尝试通过指针或引用应用程序使用我的结构中的一个字段时,它就会崩溃。如果我直接更改字段,它可以正常工作。
在测试应用程序中,我发现在结构中使用小于 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 上的相同代码可以正常工作。将 pack(1) 更改为 pack(4) 或只是 pack() 可以解决此问题,但结构更大。
为什么这种对齐会导致问题?
【问题讨论】:
-
您是否尝试过将成员从大到小排序?这有什么不同吗?
-
确实有帮助,但是在嵌套结构的不同级别添加新的小字段又会导致问题。使用 pack(1) 很难管理多级结构。
标签: c++ visual-studio-2008 struct windows-ce memory-alignment