是在静态内存中创build的C ++中的string文字?
是在静态内存中创build的C ++中的string文字,只有在程序退出时才被销毁?
它创build的地方是编译器作者的实现决定。 很可能,string文字将被存储在只读内存段中,因为它们永远不会改变。
在旧的编译器时代,您曾经拥有像这些文字和全局但可更改数据的静态数据。 这些被存储在TEXT(代码)段和DATA(初始化数据)段中。
即使你有像char *x = "hello";
这样的代码char *x = "hello";
hello
string本身存储在只读存储器中,而variablesx
在堆栈上(或者在可写内存中的其他地方,如果它是全局的)。 x
只是设置为hello
string的地址。 这允许各种棘手的事情,如string折叠,以便“无效选项”(0x1000)和“有效选项”(0x1002)可以使用相同的内存块,如下所示:
+-> plus:0 1 2 3 4 5 6 7 8 9 ABCDE | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+ 0x1000 | i | n | v | a | l | i | d | | o | p | t | i | o | n | \0 | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+
请记住我并不是指只读存储器的ROM,只是专用于存储不可更改的东西(可能被标记为只读操作系统)的内存。
他们也永远不会被销毁,直到main()
退出。
是的,即使在销毁静态对象的过程中,string文字在整个程序期间都是有效的。
标准中的2.13.4 / 1表示
一个普通的string文字具有types“n常量字符数组”和静态存储持续时间。
该标准在3.7.1 / 1中提到了“静态存储时间”
这些对象的存储将在程序期间持续。
嗯,是。 他们必须是; 构成每个string中字符序列的信息必须在某处。 如果要dynamic分配并初始化,那么用于初始化的信息将驻留在哪里? 因此,简单地使string变为静态是更有效的,这样一旦程序加载完成后,它们总是可用且有效的。
string文字存储在只读内存段中