【问题标题】:Which is the preferred way to clear a std::string object? [closed]哪种是清除 std::string 对象的首选方法? [关闭]
【发布时间】:2021-08-04 09:11:51
【问题描述】:
#include <string>

using namespace std::literals;

int main()
{
    auto str = std::string{};
    str.resize(1024);

    // #1
    str = {};

    // #2
    str = ""; 

    // #3
    str = ""s;

    // #4
    str.clear();
    
    // #5
    str.resize(0);
    str.shrink_to_fit();
}

清除 std::string 对象的首选方法是什么?为什么?

【问题讨论】:

  • 这些语句是否会导致为每个语句发出不同的汇编代码?你第一次检查了吗?
  • shrink_to_fit 有点不同,它会删除任何未使用的容量。显然,clear 也可以做到这一点,但大多数实现都没有:“与std::vector::clear 不同,C++ 标准没有明确要求此函数不改变容量,但现有实现不会改变容量。这意味着它们不会释放分配的内存。” (cppreference)
  • 观看此视频:string.clear() vs string = ""
  • 我相信这个上下文需要“清除它后你想做什么”才能完成。或者它的任何工作方式都应该没问题。
  • 我的意思是,如果有一个字面上称为clear 的函数,你会认为这是clear 字符串的首选方式...

标签: c++ memory-management resources c++17 idioms


【解决方案1】:

你的问题的正确答案

清除 std::string 对象的首选方法是什么?

(你在问之前就知道了)是 #4,str.clear();,因为它clear是字符串。

  • #1 是初始化
  • #2 和 #3 是分配
  • #4,答案,清除字符串
  • #5 调整字符串大小

如果您对其他见解感兴趣,可以将代码复制并粘贴到 Godbolt 并检查汇编器输出。

惯用的正确分析器是#4,也许是#1

【讨论】:

  • #1 也是一个作业
  • 是的,你是对的
  • #1 是不是初始化。这是任务。
  • 是的,而且你是对的。 Ayxan Haqverdili 已经写过了。为什么要加倍评论?
  • @ArminMontigny 因为您的回答说“#1 是初始化”,这是错误的。这只是任务。我也是这个意思。
【解决方案2】:

这取决于你想从代码中得到什么以及你最喜欢什么风格。

出于所有意图和目的,#1#2 的行为相同 - 只需分配空数据而不更改 capacity()

#3 构造新字符串并立即将其移动分配给旧字符串。这不仅改变了size(),还改变了capacity()。版本#5 的作用相同,但不需要构造新的std::string

最后#4 改变大小和可能改变容量,但这取决于实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2013-07-16
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    相关资源
    最近更新 更多