2014-01-09 28 views
2

我有一個struct最小化總結構存儲器

struct st 
{ 
    short a; 
    int *b; 
    char ch; 
}; 

short是2個字節
int*是8個字節在64
char是1字節

所有上述共同應該給我11字節。但如果我做sizeof(st)我得到24個字節。爲什麼struct使用更多的內存以及如何將內存減少到11個字節?

+2

字節對齊? – zero298

+0

謝謝我將搜索這個 – Luka

+2

http://en.wikipedia.org/wiki/Data_structure_alignment –

回答

2

pragma pack通常是使用什麼,但它不像你想的那樣便攜。下面是關於它的文檔:

兩者都提供#pragma pack(n)pushpop

在沒有包裝的,嘗試重新排序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將幫助您找到疼痛點。

+0

使用pragma pack:a)將導致任何速度命中,b)我將在11個字節中得到這個結果嗎? – Luka

1

我知道這是晚了,我知道你已經接受了一個答案,但這也可以工作..你會得到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; 
} 
+0

感謝您的回答,我如何在Visual Studio 2012中編譯這個? – Luka

+0

增加了一個VS2012的例子。 – Brandon