gpt4 book ai didi

c++ - 为什么 C++11 使 std::string::data() 添加一个空终止字符?

转载 作者:IT老高 更新时间:2023-10-28 12:44:22 26 4
gpt4 key购买 nike

以前这是 std::string::c_str() 的工作,但是在 C++11 中,data() 也提供了它,为什么c_str() 的空终止字符添加到 std::string::data()?对我来说,这似乎是在浪费 CPU 周期,在 null 终止字符根本不相关且仅使用 data() 的情况下,C++03 编译器没有关心终止符,不必在每次调整字符串大小时都将 0 写入终止符,而是 C++11 编译器,因为 data()-null-guarantee,每次调整字符串大小时都必须浪费循环写入 0,因此由于它可能会使代码变慢,我想他们有一些理由添加该保证,它是什么?

最佳答案

这里有两点要讨论:

空终止符的空格

理论上,C++03 实现可以避免为终止符分配空间和/或可能需要执行复制(例如 unsharing)。

然而,为了支持 c_str(),所有健全的实现都为空终止符分配了空间。首先,因为如果这不是一个微不足道的调用,它将几乎无法使用。

空终止符本身

确实有些very (1999), very old implementations (2001) 写了 \0c_str()打电话。

但是,主要实现 changed (2004) 或者是 already like that (2010) 在 C++11 发布之前避免这样的事情,所以当新标准到来时,对许多用户来说没有任何改变。

现在,C++03 实现是否应该这样做:

To me it seems like a waste of CPU cycles

不是真的。如果您调用c_str()不止一次,您已经通过多次编写它来浪费周期。不仅如此,您还弄乱了缓存层次结构,这在多线程系统中很重要。回想一下,多核/SMT CPU 开始出现在 2001 之间。和 2006 ,这解释了向现代非 CoW 实现的转变(即使在那之前的几十年里有多 CPU 系统)。

您可以保存任何内容的唯一情况是,如果您从未调用过 c_str() .但是,请注意,当您重新调整字符串的大小时,无论如何您都在重新编写所有内容。额外的字节将难以测量。

换句话说,通过在重新调整大小时编写终止符,您将自己暴露在更差的性能/延迟中。通过同时编写一次,您必须执行字符串的拷贝,性能行为更加可预测,并且如果您最终使用 c_str(),您可以避免性能缺陷。 ,特别是在多线程系统上。

关于c++ - 为什么 C++11 使 std::string::data() 添加一个空终止字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56851084/

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