8

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

struct {
    double re[2];
};

double re[2];

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

4

7 回答 7

27

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

于 2009-06-19T23:37:55.720 回答
12

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

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

struct space_filled
{
    char       part0;
    double     part1;
};

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

于 2009-06-19T23:37:58.777 回答
6

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

一个例外是:

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

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

于 2009-06-19T23:38:59.213 回答
3

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

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

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

于 2009-06-19T23:38:34.610 回答
2

不,它没有。

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

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

于 2009-06-19T23:38:35.423 回答
0

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

于 2009-06-19T23:38:40.023 回答
0

有时,请参阅:http ://en.wikipedia.org/wiki/Sizeof

于 2009-06-19T23:45:56.343 回答