gpt4 book ai didi

c++ - std::string 和多重连接

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:57:29 26 4
gpt4 key购买 nike

让我们考虑该片段,并假设 a、b、c 和 d 是非空字符串。

    std::string a, b, c, d;
d = a + b + c;

当计算这 3 个 std::string 实例的总和时,标准库实现创建第一个临时 std::string 对象,在其内部缓冲区中复制ab 的连接缓冲区,然后在临时字符串和 c 之间执行相同的操作。

一位程序员同事强调,operator+(std::string, std::string) 可以定义为返回一个 std::string_helper 而不是这种行为.

这个对象的真正作用是将实际的连接推迟到它被转换为 std::string 的那一刻。显然,operator+(std::string_helper, std::string) 将被定义为返回相同的助手,这将“记住”它有一个额外的连接要执行的事实。

这样的行为可以节省创建 n-1 个临时对象、分配它们的缓冲区、复制它们等的 CPU 成本。所以我的问题是:为什么它不能像那样工作?我想不出任何缺点或限制。

最佳答案

why doesn’t it already work like that?

我只能推测为什么它最初是这样设计的。也许字符串库的设计者根本就没有想到;也许他们认为额外的类型转换(见下文)可能会使某些情况下的行为过于令人惊讶。它是最古老的 C++ 库之一,许多我们认为理所当然的智慧在过去几十年根本不存在。

至于为什么它没有被更改为那样工作:它可以通过添加额外的用户定义类型转换来破坏现有代码。隐式转换最多只能涉及一个用户定义的转换。这是由 C++11、13.3.3.1.2/1 指定的:

A user-defined conversion sequence consists of an initial standard conversion sequence followed by a user-defined conversion followed by a second standard conversion sequence.

考虑以下几点:

struct thingy {
thingy(std::string);
};

void f(thingy);

f(some_string + another_string);

如果 some_string + another_string 的类型是 std::string,则这段代码没问题。这可以通过转换构造函数隐式转换为 thingy。但是,如果我们要更改 operator+ 的定义以提供另一种类型,那么它需要两次转换(string_helperstringthingy),因此将无法编译。

因此,如果字符串构建的速度很重要,您将需要使用替代方法,例如使用 += 进行连接。或者,根据 Matthieu 的回答,不用担心,因为 C++11 以不同的方式修复了低效率问题。

关于c++ - std::string 和多重连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9619659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com