std::string and const char *
std::string and const char *
如果我使用
const char * str = "Hello";
运行时中不需要内存分配/解除分配
如果我使用
const std::string str = "Hello";
字符串类内部是否会通过new/malloc进行分配?我可以在汇编中找到它,但我不擅长阅读
若答案是"是的,将会有malloc/new",为什么?如果我需要编辑编辑字符串,为什么在std::string中只能传递到内部const char指针并进行实际的内存分配?
字符串类内部是否会通过new/malloc进行分配?
这取决于情况。string
对象必须提供一些内存来存储数据,因为这是它的工作。一些实现使用"小字符串优化",其中对象包含一个小缓冲区,并且只有在字符串太大时才从堆中进行分配。
如果我需要编辑字符串,为什么
std::string
内部只能传递到内部常量字符指针并进行实际的内存分配?
您所描述的不一定是优化(因为每当您修改字符串时,它都需要额外的运行时检查),而且在任何情况下,迭代器无效规则都不允许这样做。
有一个关于string_view
的建议,允许您使用类似const string
的接口访问现有的字符序列,而无需任何内存管理。它还不是标准的,并且不允许您修改字符串。
std::string
的Naive实现将需要堆分配,但是,如果在运行时未修改初始化的字符串,则允许编译器通过用替代实现的对象替换静态初始化的std::string
对象来优化它们。
实例化不可变字符串时可以使用const std::string
,以确保更好的优化。
C++标准实际上并没有说不能只存储指向外部字符串(和长度)的指针。然而,这意味着每次修改字符串(例如char& std::string::operator[](size_t index)
)时都必须确保该字符串实际上是可写的。由于大量使用字符串并不是只使用常量字符串来存储字符串,而是确实修改了字符串[或者使用了一个不是常量输入的字符串]。
因此,一些问题是;
std::string s = "Hello";
char &c = s[1];
c = 'a'; // Should make string to "Hallo".
如果:
char buffer[1000];
cin.getline(buffer); // Reads "Hello"
std::string s = buffer;
cin.getline(buffer); // Reads "World"
s
现在的值是多少?
在很多这样的情况下,如果只复制原始字符串,会导致更多的问题,而且几乎没有好处。
- 在字符串函数中抛出'char const*'实例后调用的终止
- 双重标准?为什么只有 char* const&a = "bla" 的警告?
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 为什么 const char* const & = 可以编译"hello"?
- 将字符串文本常量定义为 char const* 和 wchar const*
- 如何将std::wstring转换为char const[]
- "char const * name() const _WEBSOCKETPP_NOEXCEPT_TOKEN_ {"剂量是什么意思
- 使用提升对字符串进行标记化时,将令牌转换为 char* const* 时失败
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 将 std::vector<std::string> 转换为 const char* const*
- 引发"char const*"错误的实例后调用的终止
- 将const char * const参数成员分配给新值
- 从'const char**'到'char* const*'的转换无效
- 从 sub_match<常量字符 *>' 转换为'const char *const &'
- char*const和constchar*之间有什么区别?(重复-需要更多澄清)
- 使用工厂方法时编译器错误:无法转换"const std::p air<char* const
- HEVC 解码器端口 Android 警告:从 'signed char*' 到 'char const* 的转换无效*
- 如何从'char const*'中删除常量
- 'char const *str'作为模板参数
- 为什么不;t strlen(.)应为const char*const str,而不是const char*