在C ++ 11及更高版本中调用函数/方法时,哪个更好(如果有区别)?
让我们假设此功能/方法:
void func(std::string s) { ... }
以下哪个最佳?
func(std::string())
或
func("")
更笼统地说,在初始化或传递参数期间始终显式调用构造函数有什么好处吗?
答案 0 :(得分:3)
最好调用默认构造函数,因为可以保证不会做任何不必要的工作。
传递空字符串文字时,字符串实现可能会处理该字符串(例如,计算其长度)。空字符串文字不是魔术子弹,可以与非空字符串文字区别对待。它的类型为const char[1]
,它衰减为const char*
,就是这样-处理此文字的std::string
构造函数将完成不必要的工作。
从cppreference到std::string::string()
:
默认构造函数。构造空字符串(零大小和未指定容量)。如果未提供分配器,则从默认构造的实例中获取分配器。
...以及std::string::string(const char*)
:
使用内容以s指向的以空终止的字符串的副本初始化的内容来构造字符串。字符串的长度由第一个空字符确定。 [...]
有关更多信息,请参见this short article。
答案 1 :(得分:0)
我想比较func(std::string())
和func("")
:
func(std::string())
std::string
对象的默认参数为空字符串std::string
对象传递给func
函数。您按值传递它,然后将在堆栈内存中分配一个新的std::string
对象,并调用复制构造函数对其进行初始化。std::string
对象。 func("")
std::string
对象,并使用std::string(const char*)
构造函数。std::string
对象。因此,我认为对于这种特定情况,func("")
可能更好。