C 结构';s对字体大小的贡献

C 结构';s对字体大小的贡献,c,struct,overhead,C,Struct,Overhead,我想知道为什么以下两种类型 struct { double re[2]; }; 及 你有C码的吗?struct不会增加一点大小开销吗?不,它只是将所有元素组合成一个更高级别的元素,其大小仅仅是单个元素大小的总和(加上一些填充,具体取决于对齐规则,但这超出了本问题的范围).如果它能帮上忙的话,那就不行了——C避免了像瘟疫一样的开销。具体来说,它避免了这种情况下的开销 如果使用不同的结构,您可能会看到不同: struct space_filled { char part

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

struct {
    double re[2];
};


你有C码的吗?struct不会增加一点大小开销吗?

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

如果它能帮上忙的话,那就不行了——C避免了像瘟疫一样的开销。具体来说,它避免了这种情况下的开销

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

struct space_filled
{
    char       part0;
    double     part1;
};

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

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

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

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

不,它不需要

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


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

不,C中的结构类型只是在内存中按顺序布局成员。

不,结构不需要添加任何内容。与java或.NET不同,类(和结构)在C和C++中有一堆其他的责任,它们只是用来保存多个数据成员的容器。在C++中,如果存在任何虚拟函数调用,它们可能必须存储一个VTE来解决,但一般来说,不,结构本身没有开销。 唯一的例外是:

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

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

有些结构,请参见:

有关结构中对齐的效果,请参见单独声明的char&double仍将占用相同的空间量,因为填充仍然存在。这只是不可见的堆栈空间。但根据项目的地址可以显示填充。不一定-如果有另一个字符,或一个短字符或一个int,或是序列中的每一个字符(在相当正常的大小假设下),那么就不会有空格。但如果没有这样的“填充”变量,你是对的。(而且我不认为C标准保证局部变量会以任何特定的顺序相对彼此排列。)@Jonathan:我很确定它不会,因此编译器可以按照自己喜欢的方式自动排序,以节省空间。事实上,只要指向automatic的指针不离开本地范围,我认为automatic根本不需要在堆栈上——编译器可以根据需要将它们保存在寄存器中。我想。
typedef struct {} empty;
assert(sizeof(empty) > 0);