如果我不将预先编写的字符串保存到变量,它还在内存中吗?

If I don't save prewritten string to variable, is it still in memory?

本文关键字:变量 内存 保存 字符串 如果      更新时间:2023-10-16

我想知道发生了什么,如果我有这样的代码段:

std::string var1 = "Something";
"Something else";

显然我有一个名为"var1"的 std::string 类型的变量,但我不知道我没有保存到任何变量的另一个字符串是否仍在内存中的某个地方。

基本上我正在使用SQL,我有一个语句,该语句仅在创建数据库时调用一次。所以我想知道我是否应该做

const std::string query = "statement";

在头文件中的某个地方,或者只是立即使用"语句"作为参数。我更喜欢第一种方式,因为如果需要,我可以重用字符串。

我知道它只有几个字节,这并不重要,我只是想知道内存中发生了什么。

谢谢

编辑:

好的只是为了更清楚。 如果我调用方法:

sql.Execute("statement");

文字值"语句"是否在程序的整个生命周期中保存在内存中的某个位置?

文字值是表达式,是"最小"的表达式形式之一。并且所有表达式都可以用作语句(只需添加语句终止符;)。所以靠它自己

"Something else";

是一个有效的语句。它不做任何有用的事情,除了最愚蠢的编译器之外,应该被所有人优化。


现在,如果您的代码看起来像这样

std::string var1 = "Something"    // Note that there's no semicolon here
"Something else";

这将被翻译为

std::string var1 = "Something" "Something else";

这将被解析为字符串文字连接并编译为

std::string var1 = "SomethingSomething else";

至于字符串文字是否存储在内存中,是的。字符串文本存储为字符的常量数组(包括字符串 null 终止符)。

这些数组的生命周期是程序本身的生命周期,它们具有静态存储持续时间,指向这些数组元素的指针将始终有效。

另请注意,允许编译器组合字符串文本的存储。因此,如果您在多个位置使用相同的文本,则编译器只能存储字符串的单个副本。