【问题标题】:Char array pointer vs string refrence in params参数中的字符数组指针与字符串引用
【发布时间】:2011-01-11 01:25:57
【问题描述】:

我经常看到以下结构,尤其是在构造函数中:

class::class(const string &filename)
{
}


class::class(const char * const filename)
{
}

通过逐步调试,我发现如果我传递一个硬编码的字符串,第二个构造函数总是被调用。

任何想法:

1) 为什么使用对偶结构?

2) 速度差是多少?

谢谢。

【问题讨论】:

    标签: c++ string function argument-passing


    【解决方案1】:

    需要两个构造函数,因为您可以将NULL 传递给您的MyClass::MyClass(const std::string &arg)。提供第二个构造函数可以使您免于愚蠢的崩溃。

    例如,您为您的类编写构造函数,并使其采用const std::string &,这样如果您使用const char*,您就不必检查任何指针是否有效。 在您的代码中的任何地方,您都只是在使用std::strings。在某些时候,您(或其他程序员)会传递一个const char*。这是std::string 的重要部分——它有一个构造函数,它接受char*,这非常好,除了std::string a_string(NULL) 编译没有任何问题,只是不起作用。

    这就是你展示的第二个构造函数派上用场的地方:

    MyClass::MyClass(const char* arg)
        : m_string(arg ? arg : "")
    {}
    

    如果您将NULL 传递给它,它将生成一个有效的std::string 对象。

    在这种情况下,我认为您无需担心任何速度。您可以尝试测量,但我担心您会对差别很小(如果有的话)感到惊讶。

    编辑:刚刚尝试过std::string a_string(NULL);,编译得很好,这是在我的机器上运行时会发生的情况(OS X + gcc 4.2.1)(我记得我前段时间在 Windows 上尝试过,结果是非常相似,如果不完全相同):

    std::logic_error: basic_string::_S_construct NULL not valid

    【讨论】:

    • 谢谢,这说明了问题!
    【解决方案2】:

    如果实现本身处理const char*s,但主要由std::string 用户调用,这很有用。这些可以使用std::string API 调用,通常只调用c_str() 并分派到const char* 实现。另一方面,如果调用者已经有一个 c 字符串,则不需要构造临时或不需要的 std::string(这可能会很昂贵,对于更长的字符串,它是一个堆分配)。

    另外,我曾经用它解决过以下情况:

    我的接口采用std::string,但必须在外部模块中实现,因此模块和调用者模块的 STL 二进制版本必须完全匹配,否则会已经崩溃(对于便携式库来说不是很好......)。所以我将实际接口更改为使用const char*,并添加了我声明inlinestd::string 重载,因此它们没有被导出。它没有破坏现有代码,但解决了我所有的模块边界问题。

    【讨论】:

      【解决方案3】:

      1) 为什么使用对偶结构?

      如果要方便地将 std::string 对象用作参数m,则需要字符串引用版本,因为没有从 std::string 到 const char const 的隐式转换。 const char * const 版本是可选的,因为字符数组可以隐式转换为 std::strings,但它更有效,因为不需要创建临时 std::string。

      2) What is the speed difference?
      

      您需要自己衡量。

      【讨论】:

        【解决方案4】:

        提供它们基本上是为了方便。有时,如果你调用 C 函数,你会得到 char* 指针。其他的,你得到字符串,所以提供这两个构造函数只是对调用者的一种方便。至于速度,两者的速度几乎相同,因为它们都向构造函数发送内存地址。

        【讨论】:

        • 速度一样吗?即使获取字符串的构造函数确实与远程存储库联系并通过存储库通过谷歌翻译 API 下载战争与和平的中文翻译,而 char* 构造函数只是分配一个值? :P
        • 如果原始字符串是 C++ 字符串,性能将相同。如果原始字符串是 C 风格的字符串(或文字),那么只有 std::string 版本将需要创建一个临时字符串。我的建议是在必要时使用 C++ 字符串,但如果您发现性能瓶颈,请考虑添加额外的 C 样式重载。
        猜你喜欢
        • 2012-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多