【问题标题】:If I don't save prewritten string to variable, is it still in memory?如果我不将预先写入的字符串保存到变量中,它是否还在内存中?
【发布时间】:2019-07-26 07:43:06
【问题描述】:

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

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

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

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

const std::string query = "statement";

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

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

谢谢

编辑:

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

sql.Execute("statement");

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

【问题讨论】:

    标签: c++ string memory


    【解决方案1】:

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

    "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";
    

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

    这些数组的生命周期就是程序本身的生命周期,它们有静态的storage duration,指向这些数组元素的指针总是有效的。

    还请注意,允许编译器组合存储字符串文字。因此,如果您在多个地方使用相同的文字,则允许编译器仅存储该字符串的单个副本。

    【讨论】:

    • 不错的信息,只是有点离题了。我的意思是,你说编译器应该摆脱它。但我想知道如果它没有,或者现在在编辑的问题中,该字符串正在某处使用。
    • @ligazetom 我想说的是,直到你最近的编辑才真正清楚。
    • 是的,很抱歉。
    猜你喜欢
    • 2021-08-05
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    相关资源
    最近更新 更多