在C ++结构中,构造函数中的默认值和默认参数有什么区别?

时间:2019-04-25 22:28:00

标签: c++ constructor

对于结构Foo;之间在性能,内存操作等方面有什么区别

struct Foo {
 int foo = 1;
};

vs

struct Foo {
Foo(int haha = 1) : foo(haha) {}
int foo;
};

首选使用哪种?

2 个答案:

答案 0 :(得分:1)

没有真正的区别。

每个现代编译器(例如GCC,Clang,MSVC)都会优化两者之间的差异。例如,这段代码:

struct Foo {
    int foo = 1;
};

struct Bar {
    int bar;
    Bar(int value = 2) : bar(value) {}
};

void test() {
    auto f = Foo();
    auto b = Bar();
    keep(b);
}

将由GCC使用最低级别的优化(-O1)对此进行编译:

test():
        mov     eax, 1  // auto f = Foo();
        mov     eax, 2  // auto b = Bar();
        ret

Source

因此,在这两种情况下,整个构造函数调用都被优化了,最终每个都只有一条指令。 (结果可能会有所不同,但每个编译器的情况通常都是相同的。)以一种方式或另一种方式都不会提高性能。


我的意思是,除非您极端缺乏资源,否则进行这种手动优化实际上没有任何意义,因为编译器几乎总是比您更聪明并且可以优化这些东西比手动完成的速度/内存要好。

相反,您应该根据自己认为最清晰的代码进行选择。那是唯一在这里产生真正影响的想法。

答案 1 :(得分:0)

这在很大程度上取决于您的编译器。我将您的代码放入CompilerExplorer中,这就是我发现的:https://godbolt.org/z/5WmOno

它们非常相似,但第一种方法效率更高。对于int foo = 1;,该值直接在构造函数中使用。在另一种情况下,该值即使是默认值也由构造方法的调用者放入堆栈中。