为什么 std::string 不采用空指针?

kdo*_*dog 7 c++ string std null-pointer

我最近向std::string构造函数传递了一个空指针并得到了未定义的行为。我敢肯定,这是在我之前成千上万的程序员所做的事情,同样的错误无疑已经导致无数程序崩溃。使用代码转换时谈到了很多char*使用代码std::string,它的那种东西,是不是在编译时开捕,并可以很容易地在运行时的单元测试错过。

我感到困惑的是指定std::string这种方式的原因。

为什么不直接定义std::string(NULL)==""

效率损失可以忽略不计,我怀疑它在实际程序中甚至可以测量。

有谁知道std::string(NULL)未定义的可能原因是什么?

Yak*_*ont 8

据我所知,没有充分的理由。

有人刚刚在一个月前提出了对此更改。我鼓励你支持它。

std::string不是做得好的标准化的最好例子。最初标准化的版本无法实施;对其提出的要求彼此不一致。

在某些时候,这种不一致被修复了。

,规则发生了变化,阻止了 COW(写时复制)实现,这破坏了现有合理兼容std::string的ABI 。这个变化可能是解决不一致的地方,我不记得了。

它的 API 与其他的不同 std与 容器因为它不是来自同一个前stdSTL。

处理这种遗留行为 std::string视为某种考虑到性能成本的合理决策是不现实的。如果进行了任何此类测试,那都是 20 多年前的非标准合规性测试std::string(因为不可能存在,因此标准不一致)。

它在通过时仍然是 UB(char const*)0并且nullptr由于惯性,并且将继续这样做,直到有人提出方案,并证明了成本微不足道,而好处是没有。

std::string从文字构造 achar const[N]已经是一个低性能的解决方案;您在编译时已经拥有字符串的大小,然后将其放在地上,然后在运行时遍历缓冲区以查找'\0'字符(除非进行了优化;如果是这样,则空检查同样可以优化)。高性能解决方案涉及了解长度并告知std::string它,而不是从'\0'终止的缓冲区复制。

  • @kdog:测量它并发布数字。额外的检查总是会降低你的表现。程序中的指令更多,代码缓存中使用的字节更多,可能导致循环使用额外缓存行的更多指令,分支预测单元中的另一个条目。不,我错了:缓存中有数百万个字节,分支预测单元中有数百万个条目,因为此代码随处内联!:-) 是的,您知道内联代码也可以降低性能吗?在很多情况下都是如此。 (2认同)