【问题标题】:Size of struct NOT equal to the size of its content [duplicate]结构的大小不等于其内容的大小[重复]
【发布时间】:2012-09-22 14:49:37
【问题描述】:

可能重复:
Why isn't sizeof for a struct equal to the sum of sizeof of each member?

我有下一个代码:

http://ideone.com/brmRy

#include <stdio.h>
#include <stdlib.h>
 
typedef struct Test
{
        int a;
        int b;
        char c;
} Test;
 
int main(void)
{
        Test *obj = (Test*)malloc(sizeof(Test));
 
        printf("Size results:\r\n\r\nstruct: %i\r\nint #1: %i\r\nint #2: %i\r\nchar #1: %i\r\n", 
                sizeof(Test), sizeof(obj->a), sizeof(obj->b), sizeof(obj->c));
 
        return 0;
}

结果是:

尺码结果:

结构:12

int #1: 4

int #2: 4

字符 #1: 1

为什么结构体大小为 12 字节??? int - 4 个字节 char - 1 个字节

2 int + 1 char = 2 * 4 字节 + 1 字节 = 9 字节。

为什么是 12 ???

【问题讨论】:

    标签: c memory struct byte sizeof


    【解决方案1】:

    内存通常在 4 字节边界上对齐,因此即使 char 只占用 1 个字节,它也会被填充 3 个字节以满足此分段要求。值得注意的是,结构的各个元素不必对齐,因此如果您将其中一个整数设为短整数,则可以将结构大小从 12 个字节减少到 8 个字节。不过,我相信您必须在 struct 声明中的 char 旁边加上 short 才能获得此奖励。

    【讨论】:

    • 填充的重点是使结构的各个成员适当对齐,以便(此处)int 成员是四字节对齐的。为了实现这一点,结构必须(至少)与具有最大对齐要求的成员具有相同的对齐要求,因此插入填充以使结构的大小成为该要求的倍数。您可以强制(?)使用pack(ed) 属性或编译指示进行较小的对齐,但在某些架构中,未对齐的访问会导致程序中止。
    • 不,如本例所示 (stackoverflow.com/questions/8539348/…) 如果你有一个 char、char、short、char,它只占用 8 个字节。填充的重点是对齐整个结构。要节省更多费用,请查看位域 (msdn.microsoft.com/en-us/library/yszfawxh(v=vs.80).aspx)。不过,它们的使用是相当情境化的。
    • shorts 通常是两字节对齐的,因此 struct foo { short bar; char baz; }; 通常会被填充以占用四个字节。如果shortcharstructint 中彼此相邻,则您将再次需要一个字节填充以使int 正确对齐。但是在struct foo { short bar; int baz; char quux; }; 中,您通常会在shortint 之间获得两个字节的填充,以及char 旁边的三个字节(之前或之后,我认为之后更常见),所以把@987654336 @ 和相邻的 char (通常)节省了四个字节。
    【解决方案2】:

    如果您使用 gcc,您可以强制“打包”。这意味着没有对齐,并且结构条目彼此相邻。试试

    typedef struct Test
    {
        int a;
        int b;
        char c;
    } __attribute__((packed)) Test;
    

    【讨论】:

    猜你喜欢
    • 2016-03-09
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多