2014-01-09 26 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