最å°åŒ–总结构内存

时间:2014-01-09 02:00:20

标签: c++ struct memory-alignment

我有struct:

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

short是2个字节
int*是x64中的8个字节 char是1个字节

以上所有一起应该给我11个字节。但如果我åšsizeof(st)我得到24个字节。为什么struct使用更多内存以åŠå¦‚何将内存å‡å°‘到11个字节?

2 个答案:

答案 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;
}