可变字符串和不可变字符串之间的区别

问题描述 投票:0回答:2

我刚开始学习C++,但有件事我不太明白:当你用字符串初始化一个

std::string
变量时,就像这样:

std::string str = "some string";

我们有文字

"some string"
,它是不可变的。

然后我们有变量

str
存储
"some string"
并且是可变的。您可以去那里附加另一个字符串,更改字母等。

重点是:当我们用这个文字初始化

str
时,它会对这个变量进行可修改的文字复制吗?如果是这样,则意味着在内存中存在两个空格:一个用于
"some string"
文字,另一个用于可修改的
"some string"
?

并且,只是为了明确一点:如果值被硬编码在源代码中,那么它就是一个文字,不是吗?

c++ string literals string-literals
2个回答
3
投票

"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"
  • 的副本。

是的,文字是在源代码本身中硬编码的值。 编译器会根据需要将值转换为适当的类型和内存存储。

    

它会对该变量进行可修改的文字复制吗?如果是这样,那就意味着在内存中,有两个空格:一个用于“某个字符串”文字,另一个用于可修改的“某个字符串”?

0
投票
你明白了。 但编译器可以自由地进行优化。在运行时,随着零售/释放优化的出现(例如

-O2

),编译器可以做出明智的决定,如果它确实需要复制字符串 - 特别是如果
s

实际上从未发生变异。但作为一名程序员,请假设编译器不如您聪明。

    

© www.soinside.com 2019 - 2024. All rights reserved.