调用std::string的c_str()方法时实际执行了哪些操作?
关于
std::string::c_str()执行逻辑的解答 核心结论
C11及之后的标准已经明确第二种说法是合规要求,第一种仅存在于C11之前的少数过时实现中,当前所有主流STL实现都遵循第二种方案:
string::c_str()的时间复杂度强制要求为O(1),调用时不会进行内存分配、字符串拷贝操作,仅直接返回内部存储缓冲区的首地址- 标准要求
std::string内部默认维护末尾的'\0'空终止符,不需要调用c_str()时临时生成
补充疑问解答
A. 内部缓冲区是否需要始终保持空终止状态?
是,C++11起强制要求所有std::string对象内部始终保留空终止符:
- 即使是空字符串
std::string demo_str;,内部也会分配至少1字节的空间存储'\0',调用c_str()返回的指针指向这个合法的终止符,不会出现野指针 - 所有修改字符串的内置操作(拼接、截断、元素修改等)都会自动维护末尾的终止符,不需要开发者手动处理
B. std::string::substr()会自动给子串追加'\0'吗?
会。substr()返回的是独立的、符合标准要求的std::string对象,自然会遵循内部维护空终止符的规则,返回的子串末尾默认带有'\0',直接对其调用c_str()即可拿到合法的空终止C风格字符串。
额外说明:C++11之后
std::string::data()和c_str()的行为已经完全一致,都会返回带空终止符的缓冲区首地址,二者没有任何区别。主流STL实现都采用单缓冲区维护带终止符的内容,是效率最高的实现方案。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

