c++ - 在 C++ 中,文字 3 和取消引用值为 3 的变量的结果有什么区别?
问题描述
我们知道,如果我有一个变量int a{3}
,我可以a
通过&a
. 我可以得到地址&a
的指向值*&a
,它返回整数3
。所以现在我们已经得到了 number 3
,我们不能做类似&3
获取文字地址的事情,因为这会产生错误。但问题是我们可以成功地使用类似的东西*&*&a
来取回价值3
。正如我所说,*&a
已经返回一个数字3
,你不能继续它的链。为什么它在写作时有效*&*&a
?
解决方案
在机器代码(或汇编程序)级别上使用文字和使用变量之间存在显着差异:
通常,文字可以直接用机器代码编码,而如果涉及到另一个变量,则可能需要先从内存中加载另一个变量的值。
实际上,您的变体int b = *&a;
非常接近纯加载/存储架构(缺少任何类型的间接寻址)需要做的事情(假设两个变量都位于内存中, 0xadda 是 variable 的地址, 0xdaad 是 variable 的地址a
)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
与使用文字相比,您仍然无法讨论是否需要额外的内存访问......
也许对您来说更有趣:您希望如何以某种机器代码命令(&3
部分)的某种位模式“神秘地”编码某个值的地址?
推荐阅读
- database - 如何解决程序中的 ORA-01006?
- c# - 有没有办法使用与 OpenCv 的 MinMaxLoc 类似的方法来获取 n 个最大值的列表,而不是只有一个最大值?
- python - 检查数据框中的列是否缺少值
- java - java - 如何在Java中搜索大小写相同/等效的一维数组中的字符串?
- python - python + opencv - 如何正确比较图像(通过直方图)?
- css - Tailwind CSS - 响应式断点作为组件
- javascript - Javascript 错误:使用 console.log 时“while 循环中有一个意外的标记”
- selenium-webdriver - 执行“控制 ChromeDriver 的生命周期”java 代码时出现空指针异常
- c++ - 为什么 C 不从结构中获取价值?
- assembly - 如何在 nasm 中声明用户指定大小的数组?