字符串文字是如何打印的



我最近研究了c++中的字符串文字,发现字符串文字只是char数组。然后,在许多用例中(例如打印字符串文字时(,数组会衰减为指向char数组第一个元素的指针,编译器会继续读取字符,直到遇到空终止符((,此时编译器知道字符串已经结束。这种情况发生在以下示例中:

#include <iostream>
int main()
{
char str[] = "This is a string.";
std::cout << str;
}

然而,只有当字符串文字存储在内存中的某个位置时,这才有意义,就像上面的例子中它存储在变量str中一样。当我们做这样的事情时:

#include <iostream>
int main()
{
std::cout << "This is another string";
}

如何在没有任何数组的情况下打印字符串文字?c++编译器是否仍然初始化字符串文字的数组,并将字符串文字存储在内存中,而不需要手动执行?或者字符串是以其他方式打印的?

字符串文本需要存储在可执行文件或库文件中。到目前为止,最常见的方法是像在文本文件中一样进行简单的编码,这意味着在可执行文件中没有压缩或任何其他字符串转换。这允许字符串在可执行文件中具有类似于函数地址的地址。这些地址具有被称为"地址"的名称;符号"如果在同一程序中两次写入完全相同的文字字符串,则只需在可执行文件中存储一次即可(重复数据消除可以通过链接器完成,因此它甚至可以跨单独的源文件进行(。

与程序的可执行代码类似,操作系统会在需要时将字符串文字从磁盘复制到内存中。这种复制发生在";页面";因此,如果您有几个字符串文字并且其中一个被读取,那么附近的其他文字也将被读取,从而减少磁盘I/O总量。

由于不允许在运行时修改字符串文字,因此可以将它们存储在具有此类功能的平台上的.rodata部分中。这可能意味着修改它们的尝试将终止程序(同样,在某些平台上(。

最新更新