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

C++ 在C++;构造函数中的默认值和默认参数之间有什么区别?,c++,constructor,C++,Constructor,对于结构Foo;两者在性能、内存操作等方面有什么不同 struct Foo { int foo = 1; }; vs 首选哪一种?这在很大程度上取决于您的编译器。我将您的代码放入CompilerExplorer,我发现: 它们非常相似,但第一种方法更有效。在int foo=1的情况下该值直接在构造函数中使用。在另一种情况下,该值由构造函数的调用方放在堆栈上,即使它是默认值。没有真正的区别 每个现代编译器(如GCC、Clang、MSVC)都将优化消除两者之间的任何差异。例如,此代码: stru

对于结构Foo;两者在性能、内存操作等方面有什么不同

struct Foo {
 int foo = 1;
};
vs


首选哪一种?

这在很大程度上取决于您的编译器。我将您的代码放入CompilerExplorer,我发现:


它们非常相似,但第一种方法更有效。在
int foo=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)编译为:

()

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


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


相反,您应该根据您认为最清晰的代码做出选择。这是唯一一个真正不同的想法。

这是两件不同的事情。一个默认值为
1
,另一个允许您将其设置为任何您想要的值。一个等价的版本将是
Foo(int-haha=1)
,或者通过拥有一个次要的
Foo():Foo(1){
版本。第一个版本仅在C++11之后可用,是一个聚合(从C++14之后)。是的,谢谢,对不起,我指的是Foo(int-haha=1):Foo(haha){在第二种情况下,两者之间实际上存在差异——如果我有默认值但没有构造函数,我仍然可以使用它来构造该类的对象(这适用于C++14和C++17)。这很重要,因为如果一个类包含资源(如std::unique\u ptr或std::vector或其他容器)通过强制编译器省略prvalues的移动,聚合初始化可能比使用显式构造函数更有效。此外,聚合初始化可用于初始化具有无法复制或移动的成员变量的类。
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);
}
test():
        mov     eax, 1  // auto f = Foo();
        mov     eax, 2  // auto b = Bar();
        ret