gpt4 book ai didi

c++ - 指向寄存器地址的指针

转载 作者:行者123 更新时间:2023-11-30 02:48:14 25 4
gpt4 key购买 nike

当谈到在程序中引用另一个变量时,我通常对指针有很好的理解,但是引用/写入寄存器呢?这两个代码版本的性能是否相同?

#define REGISTER 0x0001 
volatile unsigned int* baseAddress = (unsigned int*) 0x60000000;
baseAddress[REGISTER] = 0x10101010;


volatile unsigned int* realRegister = (unsigned int*) 0x60000004;
realRegister = 0x10101010;

最佳答案

您不能拥有指向寄存器的指针或引用。寄存器不构成计算机主内存的一部分,并且不能使用内存地址进行寻址。

尽管使用了名为 REGISTER#define,但您的代码片段与寄存器完全无关。他们试图写入正常的、可寻址的内存。在某些操作系统架构上,特定的内存地址可能会直接映射到硬件端口(包括在某些设备上的寄存器)。然而,大多数现代操作系统不支持这一点。他们使用 virtual memory 的概念相反,指针不会直接映射到硬件位置。

关于您发布的代码,这两部分相同。第二个不会编译,因为你试图将一个整数分配给一个指针。您可以通过在赋值之前取消引用指针使其编译 (*realRegister = 0x10101010;),但是这两段代码仍然不相同:

第一段代码在地址写入它的值

reinterpret_cast<char*>(0x60000000) + sizeof(unsigned int)

相比之下,第二段代码将其值写入地址

reinterpret_cast<char*>(0x60000000) + 4

– 这两段代码仅在 sizeof(unsigned int) == 4 的机器上相同。

关于c++ - 指向寄存器地址的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22154968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com