【发布时间】:2023-10-16 18:53:01
【问题描述】:
我对 C 中的“寄存器”这个关键字有点困惑。 它似乎告诉编译器它应该存储在寄存器中,这意味着我的一些变量存储在寄存器中,而另一些则存储在内存中?如果是这样,有没有办法找出我的值是存储在寄存器中还是内存中?
例如:
int *x = (int*) 0x1234;
X 现在似乎没有指向寄存器,因为这样的地址是用于内存的。 但我已经尝试过几次寻找不同的地址(也使用“注册”关键字)。即使在互联网上似乎也没有人关心。
所以我的主要问题是:指针中的地址在指向寄存器时看起来如何?
编辑:在另一个问题的问题结束时,我找不到主要问题的答案。我的问题不是关于“注册”这个关键词,我只是提到了它。
【问题讨论】:
-
我认为现在的编译器不关注
register关键字。如果我弄错了,请有人纠正我。 -
对于
int *x = (int*) 0x1234;,地址0x1234肯定是一个内存地址,而不是寄存器,但变量x本身有一个位置(其中包含0x1234),这可能是一个寄存器或内存中。 -
编译器最终决定在哪里以及如何存储变量和中间值,但使用的策略取决于您的优化级别。出于性能原因,高度优化的代码大量使用寄存器。如果您想确切了解代码是如何编译的,请查看汇编器输出。
-
我觉得你有点困惑。首先,
register关键字不是命令,它是对编译器的建议:嘿,如果你同意的话,我希望你为此使用一个寄存器来提高速度。如果编译器认为它有更好的方法来优化代码,则不需要接受该建议。其次,您没有理由真正关心它是否成功放入寄存器中,因为结果您的代码中没有任何变化。第三,寄存器在CPU本身;为什么你认为你可以(或应该)阅读它的地址? -
您不能指向 CPU 寄存器,因为它们不是内存映射的。另一方面,如果您指的是外围寄存器;这些 是 内存映射并在地址空间中具有地址,并且声明将与您拥有的一样 - 除非您确实需要
volatile类型修饰符。register关键字与外设寄存器 无关。解决您的问题 - 它非常不清楚,我会投票重新打开它,或者更有可能指向更好的副本。