C++中std::string与字符串字面量的可变差异及相关疑问
关于std::string与字符串字面量的几个疑问解答
初始化时是否会复制字面量为可修改副本存入str?
是的。std::string的核心特性就是管理可修改的字符序列,当你用std::string str = "some string";初始化时,它会把字符串字面量的内容完整复制到自己的内部存储中——这个存储要么是std::string对象内部的小缓冲区(小字符串优化,SSO),要么是堆上动态分配的内存,都是可写的。内存中是否存在两处存储?
没错。字符串字面量"some string"会被编译器放在程序的只读数据段(比如rodata段),这部分内存是不可修改的;而str的内部存储在可写内存区域(栈上的SSO缓冲区或堆内存),是独立的可修改副本,所以内存里确实同时存在这两份内容。仅硬编码在源码中的值才算字面量吗?
不是。字面量是C++语法中直接表示值的语法元素,除了源码里硬编码的字符串字面量("abc"),还包括:- 数值字面量:比如
123(整数)、3.14(浮点数) - 字符字面量:
'a'、'\n' - 布尔字面量:
true、false - 甚至C++11及以后支持的用户自定义字面量,比如
100ms(如果定义了对应的字面量运算符)
硬编码的只是最常见的字面量形式,但不是唯一的。
- 数值字面量:比如
内容的提问来源于stack exchange,提问作者Gilberto Silva
相关产品推荐
相关产品推荐

