Struct对类型大小的贡献

8 c struct overhead

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

struct {
    double re[2];
};
Run Code Online (Sandbox Code Playgroud)

double re[2];
Run Code Online (Sandbox Code Playgroud)

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

Jim*_*uck 26

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


Jon*_*ler 12

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

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

struct space_filled
{
    char       part0;
    double     part1;
};
Run Code Online (Sandbox Code Playgroud)

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


jal*_*alf 6

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

唯一的例外是:

typedef struct {} empty;
assert(sizeof(empty) > 0);
Run Code Online (Sandbox Code Playgroud)

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