我有一個struct
:最小化總結構存儲器
struct st
{
short a;
int *b;
char ch;
};
short
是2個字節
int*
是8個字節在64
char
是1字節
所有上述共同應該給我11字節。但如果我做sizeof(st)
我得到24個字節。爲什麼struct
使用更多的內存以及如何將內存減少到11個字節?
我有一個struct
:最小化總結構存儲器
struct st
{
short a;
int *b;
char ch;
};
short
是2個字節
int*
是8個字節在64
char
是1字節
所有上述共同應該給我11字節。但如果我做sizeof(st)
我得到24個字節。爲什麼struct
使用更多的內存以及如何將內存減少到11個字節?
pragma pack
通常是使用什麼,但它不像你想的那樣便攜。下面是關於它的文檔:
兩者都提供#pragma pack(n)
,push
和pop
。
在沒有包裝的,嘗試重新排序struct
:
struct st
{
int *b;
short a;
char ch;
};
你必須要小心,如果打包訪問數據。您可能必須使用memmov
(或memcpy
)才能確保跨所有平臺的可移植性。如果你不這樣做,那麼你可能會在Windows上遇到EXCEPTION_DATATYPE_MISALIGNMENT
,或者在Linux上遇到SIGBUS
錯誤。
微軟在Windows Data Alignment on IPF, x86, and x64上有一個很好的寫法。
-Wstrict-aliasing
and -Wcast-align
將幫助您找到疼痛點。
使用pragma pack:a)將導致任何速度命中,b)我將在11個字節中得到這個結果嗎? – Luka
我知道這是晚了,我知道你已經接受了一個答案,但這也可以工作..你會得到12個字節..不是11.我不知道它是否便攜,但我認爲它是。在這裏看到:http://en.cppreference.com/w/cpp/language/alignas
#include <iostream>
struct alignas(char) aligned_struct
{
short a;
int *b;
char ch;
};
int main()
{
std::cout<<sizeof(aligned_struct);
}
編輯:
VS2012不按不包括其編譯器alignas:http://msdn.microsoft.com/en-us/library/vstudio/hh567368(v=vs.110).aspx
它似乎並不需要在VS2012以上雖然。出於某種原因,有或沒有上述,它仍然打印12:
struct aligned_struct
{
short a;
int* b;
char ch;
};
int _tmain(int argc, _TCHAR* argv[])
{
std::cout<<sizeof(aligned_struct); //prints 12
std::cin.get();
return 0;
}
字節對齊? – zero298
謝謝我將搜索這個 – Luka
http://en.wikipedia.org/wiki/Data_structure_alignment –