【问题标题】:Using auto foo = "bar" vs std::string in C++11在 C++11 中使用 auto foo = "bar" vs std::string
【发布时间】:2016-06-11 02:34:32
【问题描述】:

我正在 C++ 中使用 string::find 搜索子字符串。当我使用const auto 定义一个字符串并稍后使用该变量时,eclipse. 替换为->

我发现这个 SO thread 得出的结论是 auto foo = "bar" 被推导出为 (const char *) foo = "bar"。所以 eclipse 正确地将 . 转换为 -> 尽管我一开始有点困惑。我错误地认为auto 会变成std::string

auto foo = "bar" 推导出为std::string 而不是const char * 会有缺点吗?代码量增加,性能变慢?

【问题讨论】:

  • "bar" 的类型是const char[4]。我不知道你为什么认为这应该自动转换为std::string
  • 我认为您混淆了您可以将 const char *const char [4] 分配给字符串的事实:std::string str = "bar"; 引号之间的任何内容都只是一个普通的 const char 数组。
  • 如果您希望类型为std::string,请这样说。不要在这里使用auto

标签: c++ string performance c++11 auto


【解决方案1】:

您的代码可能有一百万个可以从const char * 隐式构造的类。为什么要选择std::string

auto 如果您想要一个具有相同类型的表达式¹ 的变量,而不是如果您想创建不同的对象,则只需节省一些键盘输入即可。

(1) 或多或少; C++ 总是让事情变得有些棘手......

【讨论】:

    【解决方案2】:

    嗯,很可能,您刚刚回答了自己的问题。 std::string 占用更多空间(它有大小计数器),它的创建涉及动态分配等。

    如今,缺少复杂的字符串类型可能看起来不合时宜,但由于 C++ 的目标是用其低级效率完全替代 C,这很容易解释。

    此外,std::string 只是一个库类。您可以选择不同的字符串类型,例如QStringstd::experimental::string_view,如果您的任务需要的话。顺便说一句,string_viewconst char[] 更相似,因为它根本不提供动态操作并且可以在constexpr 中使用

    【讨论】:

    • 谢谢。这确实就像与某人交谈,第二天我突然意识到为什么 auto 默认为 char*。非常感谢你们三个花时间回答。
    【解决方案3】:

    “Foobar”是字符串文字,而不是std::string。它以const char[7] 的形式存储在二进制文件的只读部分中。

    std::string te 类型具有从 const char * 的隐式转换,因为它有一个没有显式参数的构造函数,如果您编写:std::string s = "foobar";,则会调用它。注意 allocator 的默认参数是在构造函数上赋值的。

    使用const auto 为您提供实际类型而不是转换后的类型。因此,将字符串文字转换为 std::string 实际上会创建另一个引用该文字的对象。

    http://en.cppreference.com/w/cpp/language/string_literal http://en.cppreference.com/w/cpp/string/basic_string

    【讨论】:

    • "foobar" 的类型不是char const *,而是char const[7](6 个chars + 终止空字符)
    • 是的,你是对的。但在这种情况下几乎没有实际区别。
    猜你喜欢
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2016-02-14
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 2021-05-24
    相关资源
    最近更新 更多