我有一个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 –