Struct对类型大小的贡献

时间:2009-06-19 23:35:29

标签: c struct overhead

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

struct {
    double re[2];
};

double re[2];

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

7 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:12)

如果它可以帮助它不是 - 不。 C避免像瘟疫那样的开销。具体而言,它避免了这种情况下的开销。

如果您使用了不同的结构,您可能会发现不同之处:

struct space_filled
{
    char       part0;
    double     part1;
};

如果您的机器要求double在8字节边界上对齐(和sizeof(double) == 8,这是正常的但不是标准规定的),那么您会发现该结构占用16个字节

答案 2 :(得分:5)

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

唯一的例外是:

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

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

答案 3 :(得分:3)

没有。 Struct不会在编译的C中添加任何大小或任何开销。

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

C是一种极其“赤裸裸”的语言,这意味着除非有必要,否则没有任何内容。 所以问自己,“结构要求的开销是多少?”,你找不到任何开销。

答案 4 :(得分:2)

不,它没有。

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)