【问题标题】:Struct's contribution to type size结构对类型大小的贡献
【发布时间】:2010-11-04 11:07:41
【问题描述】:

我想知道为什么有以下两种类型

struct {
    double re[2];
};

和

double re[2];

在 C 中有相同的大小吗? struct 不会增加一点大小开销吗?

【问题讨论】:

    标签: c struct overhead


    【解决方案1】:

    不,它只是将所有元素组合成一个更高级别的元素,其大小只是单个元素的大小相加(加上一些填充,取决于对齐规则,但这超出了本问题的范围)。

    【讨论】:

    【解决方案2】:

    如果它可以帮助它就不会 - 不。 C 避免像瘟疫一样的开销。特别是,它避免了这种情况下的开销。

    如果您使用不同的结构,您可能会看到不同:

    struct space_filled
    {
        char       part0;
        double     part1;
    };
    

    如果你的机器要求double在8字节边界上对齐(而sizeof(double) == 8,这是正常的,但标准没有强制要求),那么你会发现该结构占用16字节。

    【讨论】:

    • 单独声明的 char 和 double 仍将占用相同数量的空间,因为填充仍然存在。它只是不可见的堆栈空间。但是通过项目的地址会显示填充。
    • 不一定 - 如果有另一个 char、short 或 int,或者每个顺序中的一个(在相当正常的大小假设下),那么就不会有空格。但是在没有这种“填充”变量的情况下,你是对的。 (而且我认为 C 标准不能保证局部变量会以任何特定的顺序排列。)
    • @Jonathan:我很确定它不会,所以编译器可以订购自动装置,但它喜欢节省空间,如果它愿意的话。实际上,只要指向自动对象的指针不离开本地范围,我认为自动对象根本不需要放在堆栈上——编译器可以根据需要将它们保存在寄存器中。我认为。
    【解决方案3】:

    不,结构不需要添加任何东西。与 Java 或 .NET 中的类(和结构)具有许多其他职责不同,在 C 和 C++ 中,它们只是用于保存许多数据成员的容器。在 C++ 中,如果存在虚函数调用,它们可能必须存储一个 vtable 来解析虚函数调用,但一般来说,不,结构本身没有开销。

    一个例外是:

    typedef struct {} empty;
    assert(sizeof(empty) > 0);
    

    空结构的大小不会为零。一个结构必须有 一些 非零大小,因为每个对象都必须有一个唯一的地址。 (否则你将无法创建这些结构的数组)

    【讨论】:

      【解决方案4】:

      没有。 Struct 不会增加任何大小,也不会在编译后的 C 中产生任何开销。

      这是一个语法层,需要编译器进行额外的工作,但在运行时没有开销。

      C 是一种极其“赤裸”的语言,这意味着除非需要,否则什么都没有。 所以问问自己,“结构需要什么开销?”,你不会找到任何开销。

      【讨论】:

        【解决方案5】:

        没有。

        这是结构的优点之一(为什么它们在老式 TCP/IP 编程中如此有用)。

        这是表示内存/缓冲区布局的好方法。

        【讨论】:

          【解决方案6】:

          C 中没有结构类型,只是在内存中顺序布局成员

          【讨论】:

            【解决方案7】:

            某些情况,请参阅:http://en.wikipedia.org/wiki/Sizeof

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-15
              • 2015-11-07
              • 2017-04-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多