C ++:由于结构是具有“公共”所有内容的类,因此是否创建并调用了默认-ctors?
我问的原因是要了解使用结构时 C++ 可能比 C 产生的开销(如果有的话)。我听到的一个观点是,在 C++ 中,类有一些结构没有的开销,但我对此表示怀疑。
C ++:由于结构是具有“公共”所有内容的类,因此是否创建并调用了默认-ctors?
我问的原因是要了解使用结构时 C++ 可能比 C 产生的开销(如果有的话)。我听到的一个观点是,在 C++ 中,类有一些结构没有的开销,但我对此表示怀疑。
在 C++ 中,除了结构成员的默认可见性是公共的,而类成员默认为私有之外,没有什么区别。
在性能方面,结构构造将与类构造一样快。实际速度当然取决于您的结构包含的内容。如果您将 C 结构移动到 C++,则您的结构将仅包含 POD 类型(普通旧数据 - 无类),它们无论如何都没有构造函数。
在与类完全相同的情况下,结构确实具有默认构造函数。
顺便说一句,结构不是“所有东西都公开的类”。这是一个以 public 作为默认访问说明符的类。结构可以有私有成员,但如果他们这样做,你的代码审查员可能会打你。
相关问题不是结构与类,而是 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 上。
好问题!我对 Stroustrup 的解读倾向于同意 Roddy 的回答。但是,我认为是否调用 ctor 在一定程度上取决于结构的创建方式。例如,如果您通过malloc创建结构,我不相信构造函数被调用,而如果您新建它们,我想它会。
也就是说,我实际上并没有检查过上面的内容。
在 Stroustrup 的书The C++ Programming Language, Special Edition的第 234 页第 10.2.8 节中,他给出了一个带有构造函数的结构示例。他还在文中进一步说“即使对于这样的结构,构造函数和访问函数也非常有用......” 尽管我不相信他在严格的技术意义上使用“结构”一词。所以我猜一个结构确实有一个默认的构造函数。