C++:用于结构的构造函数
C++: ctors for structs?
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节中,他给出了一个带构造函数的结构的例子。他还在文本中进一步说道:"即使对于这样的结构,构造函数和访问函数也非常有用……"尽管我不相信他使用的是严格技术意义上的"结构"一词。所以我想一个结构确实有一个默认的构造函数。
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 在类构造函数中使用结构变量
- 在 c++ 中将变量作为结构构造函数中的引用传递
- 在类构造函数中定义结构变量的参数
- 我应该在C++中将这些结构用作参数化构造函数吗?
- 初始化构造函数C++中结构的向量
- C++ 带有默认参数的结构,可选择在构造函数中更改
- 我们可以用参数化构造函数初始化结构的数组吗?
- 使用模板化结构作为构造函数参数
- 具有位域的结构的 Constexpr 构造函数
- 未调用的初始化静态thread_local结构的构造函数和析构函数
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- 如何在继承层次结构中调用具有默认参数的构造函数?
- 使用构造函数初始化结构还是在之后设置其值更好?
- 嵌套的模板结构构造函数实现
- C++:如何在结构中定义类实例.类具有参数化的构造函数
- 结构中的默认成员值或默认构造函数参数
- c++ 17 中结构自动定义构造函数的规则是什么?
- 在结构的构造函数中使用类方法赋值变量