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