哪里的C++文字常量存储在内存中?

Jer*_*ang 1 c++ pointers literals

哪里的C++文字常量存储在内存中?堆栈还是堆?

int *p = &2

是错的.我想知道为什么?谢谢

-------------------------------------------------

我的问题是"C++文字常量存储在内存中","int *p = &2

是错的",不是我的问题.

Dar*_*enW 6

细节取决于机器,但假设最常见的机器和操作系统...每个可执行文件包含几个"段" - CODE,BSS,DATA和其他一些.

CODE包含所有可执行操作码.实际上,它通常被命名为TEXT,因为不知何故,这对几十年前的人们来说是有意义的.通常它是只读的.

BSS是未初始化的数据 - 它实际上不需要存在于可执行文件中,而是在程序开始运行时由操作系统的加载程序分配.

DATA包含文字常量 - int8,int16,int32等以及浮点数,字符串文字以及编译器和链接器生成的任何奇怪的东西.这就是你要问的问题.但是,它仅包含定义用作变量的常量,如

const long x = 2;
Run Code Online (Sandbox Code Playgroud)

但不太可能保留源代码中使用的文字常量,但不能与变量紧密关联.只有一个'2'由编译器直接处理.例如在C中,

print("%d", 2);
Run Code Online (Sandbox Code Playgroud)

会导致编译器构建对print()的子程序调用,编写操作码以将指针推送到字符串文字"%d"和值2,两者都是64位机器上的64位整数(你不是其中一个仍在使用32位硬件的落后者,是吗?:)后跟操作码跳转到子程序('print'子程序的标识符).

"%d"字面值进入DATA.2没有; 它内置于操作码中,将整数填充到堆栈中.这实际上可能是"加载寄存器RAX立即",后跟值2,接着是"推送寄存器RAX",或者单个操作码可以完成这项工作.因此,在最终的可执行文件中,2将在CODE(aka TEXT)段中找到.

通常不可能指向该值或任何操作码.就C语言这样的高级语言而言,这是没有意义的(当你谈论操作码和段时,C是"高级别".)"&2"只能是一个错误.

现在,有一个指向操作码的指针并非完全不可能.无论何时在C中定义函数,或在C++中定义对象方法,构造函数或析构函数,函数的名称都可以被视为指向从该函数编译的机器代码的第一个操作码的指针.例如,没有括号的print()是指向函数的指针.也许如果您的示例代码在函数中并且您猜测正确的偏移量,则可以使用指针算法指向位于操作码之间的"立即"值2,但这对于任何现代CPU来说都不是那么容易,当然不适合初学者.