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

In C++ struct, what is the difference between default value and default argument in constructor?

本文关键字:默认 参数 区别 什么 默认值 C++ 结构 构造函数      更新时间:2023-10-16

for a struct Foo;两者在性能、内存操作等方面有什么区别

struct Foo {
 int foo = 1;
};

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

最好使用哪个?

没有真正的区别。

每个现代编译器(例如,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

(来源(

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


我的观点是,除非你非常缺乏资源,否则做这种级别的手动优化没有任何意义,因为编译器几乎总是比你聪明,并且可以优化这些东西的速度/内存比你手动做得更好。

相反,您应该根据您认为最清晰的代码做出选择。这是唯一能真正发挥作用的想法。

这在很大程度上取决于您的编译器。 我把你的代码放到编译器资源管理器中,这就是我发现的:https://godbolt.org/z/5WmOno

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