C++:用于结构的构造函数

C++: ctors for structs?

本文关键字:构造函数 结构 用于 C++      更新时间:2023-10-16

C++:由于结构是一个所有内容都是"public"的类,是否创建并调用了默认构造函数?

我提出这个问题的原因是为了理解当使用structs时,C++可能对C产生的开销(如果有的话)。我听到的一种观点是,在C++中,类有一些结构没有的开销,但我对此表示质疑。

在C++中,除了结构成员的默认可见性是公共的,而类成员的默认可视性是私有的之外,没有什么区别。

就性能而言,结构构造将与类构造一样快。实际速度当然取决于你的结构包含什么。如果要将C结构移动到C++,则结构将只包含POD类型(纯旧数据-没有类),这些类型无论如何都没有构造函数。

structs确实有一个默认构造函数,在与类完全相同的情况下。

顺便说一句,结构并不是"所有东西都是公共的类"。它是一个以public作为默认访问说明符的类。structs可以有私人成员,但如果他们有,你的代码审查员可能会打你一拳。

相关的问题不是结构与类,而是POD与非POD。

还记得一个类的"int"成员是如何未初始化的吗?除非你在初始化器列表中给它一个值,或者在构造函数中设置一个值?这同样适用于所有POD类型。POD结构(或POD类)的默认构造函数与此无关。因此,尽管它名义上存在,但编译器实际上不应该生成和调用它。

这意味着,您可以在C中定义的任何类型的默认构造函数在C++中使用时都不应该引入运行时开销。在实践中,我听到传言说,并不是所有的C++编译器都应用了足够的优化,以确保所有代码都能像编译为C时一样发出良好的二进制代码。但我不知道这是否是导致问题的问题之一——我猜它通常是相同的。

因此,给定一个POD结构:

struct sPOD {
    int foo;
    float bar;
    char baz[23];
};

下面的代码在C++中可能不会发出任何代码(除了移动堆栈指针,这取决于编译器将自动变量滚动到一起的程度),就像在C:中一样

sPOD s1;

事实上,我在gcc上并不这么认为。

好问题!我对斯特劳斯特鲁普的解读往往与罗迪的答案一致。然而,我认为是否调用ctor在一定程度上取决于如何创建结构。例如,如果您通过malloc创建结构,我不相信会调用构造函数,而如果您new它们,我想会调用的。

也就是说,我实际上还没有检查过上面的内容。

在Stroustrup的书《C++编程语言特别版》第234页10.2.8节中,他给出了一个带构造函数的结构的例子。他还在文本中进一步说道:"即使对于这样的结构,构造函数和访问函数也非常有用……"尽管我不相信他使用的是严格技术意义上的"结构"一词。所以我想一个结构确实有一个默认的构造函数。