函数调用参数char * vs字符串默认构造函数

时间:2019-07-09 09:18:19

标签: c++

在C ++ 11及更高版本中调用函数/方法时,哪个更好(如果有区别)?

让我们假设此功能/方法:

void func(std::string s) { ... }

以下哪个最佳?

func(std::string())

func("")

更笼统地说,在初始化或传递参数期间始终显式调用构造函数有什么好处吗?

2 个答案:

答案 0 :(得分:3)

最好调用默认构造函数,因为可以保证不会做任何不必要的工作。

传递空字符串文字时,字符串实现可能会处理该字符串(例如,计算其长度)。空字符串文字不是魔术子弹,可以与非空字符串文字区别对待。它的类型为const char[1],它衰减为const char*,就是这样-处理此文字的std::string构造函数将完成不必要的工作。

cppreferencestd::string::string()

  

默认构造函数。构造空字符串(零大小和未指定容量)。如果未提供分配器,则从默认构造的实例中获取分配器。

...以及std::string::string(const char*)

  

使用内容以s指向的以空终止的字符串的副本初始化的内容来构造字符串。字符串的长度由第一个空字符确定。 [...]

有关更多信息,请参见this short article

答案 1 :(得分:0)

我想比较func(std::string())func("")

  1. func(std::string())

    • 您创建的std::string对象的默认参数为空字符串
    • 然后将std::string对象传递给func函数。您按值传递它,然后将在堆栈内存中分配一个新的std::string对象,并调用复制构造函数对其进行初始化。
    • 在这种情况下,分配了两个std::string对象。
  2. func("")

    • 您传递了一个空字符串,因此编译器将在堆栈内存中分配一个std::string对象,并使用std::string(const char*)构造函数。
    • 在这种情况下,仅分配了1个std::string对象。

因此,我认为对于这种特定情况,func("")可能更好。