代码之家  ›  专栏  ›  技术社区  ›  yesraaj

C++中的字符串文字是在静态内存中创建的吗?

  •  39
  • yesraaj  · 技术社区  · 16 年前

    C++中的字符串文字是在静态内存中创建的,只有在程序退出时才被销毁?

    4 回复  |  直到 6 年前
        1
  •  38
  •   paxdiablo    6 年前

    它的创建位置实际上是编译器编写者的一个实现决策。很可能,字符串文本将存储在只读内存段中,因为它们永远不会更改。

    在旧的编译器时代,您曾经拥有类似这些文本的静态数据,以及全局但可更改的数据。它们存储在文本(代码)段和数据(初始化数据)段中。

    即使你有这样的代码 char *x = "hello"; , the hello 字符串本身存储在只读内存中,而变量 x 在堆栈上(如果是全局的,则在可写内存中的其他位置)。 X 只需设置到 你好 字符串。这允许进行各种复杂的操作,如字符串折叠,以便“无效选项”(0x1000)和“有效选项”(0x1002)可以使用相同的内存块,如下所示:

    +-> plus:0   1   2   3   4   5   6   7   8   9   A   B   C   D   E
    |      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+
    0x1000 | i | n | v | a | l | i | d |   | o | p | t | i | o | n | \0 |
           +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+
    

    记住,我的意思不是只读存储器,而是专门用来存储不变的东西的存储器(它可能被操作系统标记为真正的只读)。

    它们也不会被摧毁直到 main() 出口。

        2
  •  42
  •   James Hopkin    16 年前

    是的,字符串在整个程序期间都是有效的,即使在静态对象销毁期间也是如此。

    2.13.4/1标准中规定

    普通字符串文字具有类型“array of n const char”和静态存储持续时间。

    标准规定了3.7.1/1中的“静态存储时间”:

    这些对象的存储应在程序期间持续。

        3
  •  3
  •   unwind    16 年前

    好。。。对。它们是必须的;组成每个字符串中字符序列的信息必须在某个地方。如果要动态地分配它们,然后初始化它们,用于初始化的信息将驻留在哪里?因此,更有效的方法是简单地将字符串设置为静态,以便在程序加载完成后,这些字符串始终可用且有效。

        4
  •  -1
  •   Samiksha    16 年前

    字符串文本存储在只读内存段中