相关疑难解决方法(0)

调用“string::c_str()”时实际上做了什么?

string::c_str()调用时实际上做了什么?

  1. string::c_str()将分配内存,复制字符串对象的内部数据并将空终止字符附加到新分配的内存中?

或者

  1. 由于必须是 O(1),因此不再允许string::c_str()分配内存并复制过来。string实际上,始终存在空终止符是唯一合理的实现。

在这个问题的答案的评论中有人说C++11 要求为尾随std::string分配额外的char'\0'. 所以看来第二种选择是可能的。

另一个人说std::string操作——例如迭代、串联和元素变异——不需要零终止符。除非您将 传递string给需要以零结尾的字符串的函数,否则可以省略它

更多来自专家的声音

为什么实现者通常让 .data() 和 .c_str() 做同样的事情?

因为这样做效率更高。使 .data() 返回非 null 终止的内容的唯一方法是让 .c_str() 或 .data() 复制其内部缓冲区,或者仅使用 2 个缓冲区。拥有一个以 null 结尾的缓冲区始终意味着您在实现 std::string 时始终可以仅使用一个内部缓冲区。

string::c_str()所以我现在真的很困惑,调用时实际上做了什么?

更新

如果c_str()实现为简单地返回指针,则它已经被分配和管理。

A。由于c_str()必须以 null 终止,因此内部缓冲区需要始终以 null 终止,即使对于空的 std::string,例如: ;的内部存储器中std::string demo_str应该有一个。我对吗?\0demo_str

B.std::string::substr()调用时会发生什么自动将 a …

c++ string stl

8
推荐指数
1
解决办法
1577
查看次数

标签 统计

c++ ×1

stl ×1

string ×1