C ++:ctors for structs?

时间:2008-10-30 12:39:57

标签: c++ performance class constructor struct

C ++:由于struct是一个包含所有“public”的类,是否创建并调用了default -ctors?

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

4 个答案:

答案 0 :(得分:15)

在C ++中没有区别,除了struct member的默认visibilty是public,而class members默认为private。

在性能方面,结构构造与类构造一样快。 实际速度当然取决于结构包含的内容。如果要将C结构移动到C ++,那么结构将只包含POD类型(普通旧数据 - 没有类),无论如何都没有构造函数。

答案 1 :(得分:13)

结构体确实有一个默认的构造函数,与类完全相同。

顺便说一下,结构不是“一个公开的一类”。它是一个以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上确实不适合我。

答案 2 :(得分:1)

好问题!我对Stroustrup的阅读倾向于赞同Roddy的回答。但是,我认为是否调用ctor在某种程度上取决于结构的创建方式。例如,如果你通过 malloc 创建结构,我不相信构造函数被调用,而如果你 new 它们,我想它会。

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

答案 3 :(得分:1)

在Stroustrup的书中, C ++编程语言,特别版,第234页第10.2.8节,他给出了一个带构造函数的结构示例。他还在文本中进一步说明“构造函数和访问函数即使对于这样的结构也非常有用......”虽然我不相信他在严格的技术意义上使用“结构”这个词。所以我猜测结构确实有一个默认的构造函数。