在 C++ 中,文字 3 和取消引用值为 3 的变量的结果有什么区别?

In C++, what's the difference between a literal 3 and the result of de-referencing a variable with a value 3?

我们知道如果我有一个变量int a{3},我可以通过&a得到a的地址。我可以通过 *&a 获得地址 &a 的指向值,其中 returns 整数 3。所以现在我们已经得到了数字 3,我们不能做类似 &3 的事情来获取文字的地址,因为那样会产生错误。但问题是我们可以成功地使用 *&*&a 之类的东西来取回 3 的值。正如我所说,*&a 已经 returns 一个数字 3 并且您无法在其上继续链。为什么写 *&*&a?

时有效

在机器代码(或汇编程序)级别使用文字和使用变量之间存在显着差异:

通常,文字可以直接用机器代码编码,而如果涉及到这样的变量,则可能需要先从内存中加载另一个变量的值。

实际上,您的变体 int b = *&a; 非常接近纯 load/store 架构(缺少任何类型的间接寻址)需要做的事情(假设两个变量都位于内存中,0xadda 是变量地址 a, 0xdaad 变量 b):

MOV Rx, ADDA; // move address of a into some register
LD  Ry, Rx;   // load value at address in register into a second one
              // (maybe there's a direct addressing mode, then both operations
              // could be a single one)
MOV Rx, DAAD;
ST  Rx, Ry;

相比之下,int b = 3;在同一台机器上要简单一些:

MOV Rx, DAAD;
MOV Ry, 3;    // 3 directly encoded in bit pattern
ST  Rx, Ry;

好的,也许你有一些合适的寻址模式,这样 int b = a; 可以 在一条指令中编码:

MOV #DAAD, #ADDA // # indicating indirect access via address

你仍然不能讨论与使用文字相比需要额外的内存访问...

也许对你来说更有趣:你想如何获得某些值的地址'mystically'编码在某些机器代码命令(&3部分)的某些位模式中?