【问题标题】:C++ modern string pointers [closed]C ++现代字符串指针[关闭]
【发布时间】:2017-05-03 05:16:40
【问题描述】:

是否建议在现代 c++ 字符串上使用指针? 像这样:

std::string *test = new string();
anyfunction(test);

test 变量中是一个很长的文本。所以我认为,使用指针操作更容易、更快捷。

这是好代码还是坏代码?

【问题讨论】:

  • c++ 更喜欢引用。例如std::string test; void anyfunction(const std::string& s); anyfunction(test).
  • 是否建议在现代 c++ 字符串上使用指针? 不,永远不要这样做。在我编写的最后一百万行 c++ 代码中,我没有一次这样做过。

标签: c++ string c++11 pointers


【解决方案1】:

在现代 C++ 中不建议使用原始指针。相反,您可以使用智能指针。 C++11 中有四个智能指针——std::auto_ptr、std::unique_ptr、 std::shared_ptr 和 std::weak_ptr。 所有这些都旨在帮助管理动态分配对象的生命周期,即通过确保在适当的时间以适当的方式销毁这些对象(包括 如果有例外情况)。

【讨论】:

  • auto_ptr 已被弃用。在这种情况下,最好的建议是根本不要使用指针。
  • 请注意,std::auto_ptr 自 C++11 以来已被弃用,并且在 C++17 中不存在
  • 我可以用什么来代替 std::auto_ptr?因为我听说它已被弃用。
  • 是的,我同意。 auto_ptr 已弃用。 @ Hball:std::unique_ptr 做了 std::auto_ptr 所做的一切,还有更多。它的执行效率同样高,而且它不会扭曲复制对象的含义。各方面都比 std::auto_ptr 好
【解决方案2】:

总的来说,这是一个非常糟糕的想法 - 有两个原因:

次要原因:您使用手动堆分配而不将其包装在智能指针中。但是添加例如std::unique_ptr 只会给症状贴上创可贴。

主要原因:您的思考方向正确(避免不必要的大量垃圾数据副本),但您使用了错误的工具。函数参数的类型是正确的工具。

函数是否只需要读取字符串?那么它的签名应该是:

return_type anyfunction(const std::string& test);

通过 const ref 传递不会复制字符串。如果您还需要写访问权限,请忽略const

return_type anyfunction(std::string& test);

再一次,没有复制。将字符串移动到函数中也可能是一种选择。但如果没有进一步的上下文,这很难说。

【讨论】:

    【解决方案3】:

    std::string 基本上是在堆上创建的。一些优化版本会在堆栈上创建短字符串以提高速度,但这不是问题。

    不建议使用 new 创建,因为对象超出范围时无法自动销毁。 (有时您想要这种行为,但这种情况很少见,对于初级 C++ 程序员,您真的应该将 new 视为过时的)。而且它不会显着影响您的堆栈使用,因为堆栈上只有几个微不足道的控制变量。

    你还没有展示你是如何初始化它的。或者您打算如何使用这些数据。虽然传递 const std::string & 实际上只是传递指针的替代表示法,但它更惯用。然而,现代 C++ 正在转向字符串视图。本质上是创建字符串,然后创建数据视图。如果字符串很长,这可能很重要。例如,如果您的长字符串是胖数组,则在长字符串上搜索短子字符串非常耗时,如果它是后缀树则非常快。

    字符串视图仍处于试验阶段: http://en.cppreference.com/w/cpp/experimental/basic_string_view

    【讨论】:

      【解决方案4】:

      使用指针意味着另一个层次的间接性。 C++11 具有移动语义意味着人们可以轻松地移动字符串的副本,而无需进行深度复制,这在很大程度上消除了new 字符串或任何其他 C++ 对象的需要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-30
        • 1970-01-01
        • 2018-06-11
        • 1970-01-01
        • 2021-03-30
        • 2014-02-16
        • 1970-01-01
        • 2021-11-03
        相关资源
        最近更新 更多