我刚开始学习C++,但有件事我不太明白:当你用字符串初始化一个
std::string
变量时,就像这样:
std::string str = "some string";
我们有文字
"some string"
,它是不可变的。
然后我们有变量
str
存储 "some string"
并且是可变的。您可以去那里附加另一个字符串,更改字母等。
重点是:当我们用这个文字初始化
str
时,它会对这个变量进行可修改的文字复制吗?如果是这样,则意味着在内存中存在两个空格:一个用于 "some string"
文字,另一个用于可修改的 "some string"
?
并且,只是为了明确一点:如果值被硬编码在源代码中,那么它就是一个文字,不是吗?
"some string"
是 const char[12]
类型的字符串文字。 在某些情况下,例如在函数参数中,数组“衰变”为指向其第一个元素的指针。 在本例中,指向 const char*
指针。std::string str = "some string";
只是语法糖,它在功能上与
std::string str("some string");
相同,它调用 std::string
构造函数,该构造函数以 const char*
作为输入。 该构造函数确实将字符数据复制到自己的内存中。 根据编译器的 std::string
实现,这将位于:
动态内存std::string
对象之外,但由对象的内部成员指向。
位于std::string
中的SSO(短字符串优化)缓冲区。
所以,是的,内存中的某个地方会有 2 个"some string"
是的,文字是在源代码本身中硬编码的值。 编译器会根据需要将值转换为适当的类型和内存存储。
它会对该变量进行可修改的文字复制吗?如果是这样,那就意味着在内存中,有两个空格:一个用于“某个字符串”文字,另一个用于可修改的“某个字符串”?
你明白了。 但编译器可以自由地进行优化。在运行时,随着零售/释放优化的出现(例如),编译器可以做出明智的决定,如果它确实需要复制字符串 - 特别是如果
-O2
s
实际上从未发生变异。但作为一名程序员,请假设编译器不如您聪明。