我有struct
:
struct st
{
short a;
int *b;
char ch;
};
short
是2个å—节
int*
是x64ä¸çš„8个å—节
char
是1个å—节
以上所有一起应该给我11个å—节。但如果我åšsizeof(st)
我得到24个å—节。为什么struct
使用更多内å˜ä»¥åŠå¦‚何将内å˜å‡å°‘到11个å—节?
ç”案 0 :(得分:2)
pragma pack
通常是使用的,但它ä¸åƒä½ æƒ³çš„é‚£æ ·ä¾¿æºã€‚这是关于它的文档:
两者都æä¾›#pragma pack(n)
,push
å’Œpop
。
如果没有打包,请å°è¯•é‡æ–°æŽ’åºstruct
:
struct st
{
int *b;
short a;
char ch;
};
如果数æ®å·²æ‰“包,您必须å°å¿ƒè®¿é—®æ•°æ®ã€‚您å¯èƒ½éœ€è¦memmov
(或memcpy
)æ¥ç¡®ä¿æ‰€æœ‰å¹³å°çš„å¯ç§»æ¤æ€§ã€‚如果ä¸è¿™æ ·åšï¼Œé‚£ä¹ˆæ‚¨å¯èƒ½ä¼šåœ¨Windows上é‡åˆ°EXCEPTION_DATATYPE_MISALIGNMENT
或在Linux上é‡åˆ°SIGBUS
错误。
Microsoft在Windows Data Alignment on IPF, x86, and x64ä¸Šæœ‰ä¸€ç¯‡å¾ˆå¥½çš„æ–‡ç« ã€‚
-Wstrict-aliasing
和-Wcast-align
将帮助您找到疼痛部ä½ã€‚
ç”案 1 :(得分: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;
}