在 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
部分)的某些位模式中?
我们知道如果我有一个变量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
部分)的某些位模式中?