假设C++编译器编译了一个体系结构的代码,其中CPU寄存器不是内存映射的。另外,假设同一个编译器为CPU寄存器保留了一些指针值。
例如,如果编译器出于任何原因(例如,优化原因)对变量使用寄存器分配(而不是谈论寄存器关键字),并且我们打印对该变量的引用的值,编译器将返回一个保留的“地址值”。
那个编译器会被认为是符合标准的吗?
从我收集到的信息来看(我还没有读过全部内容-- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4868.pdf),我怀疑标准没有提到内存内存或操作内存,而是定义了自己的内存模型,指针表示地址(可能是错误的)。
现在,由于寄存器也是一种内存形式,我可以想象,将寄存器视为内存模型一部分的实现可能是合法的。
发布于 2020-11-02 23:09:55
指针指向C++寄存器合法吗?
是也不是。在C++中,如果不建议使用register关键字,则是对编译器的建议,而不是需求。
编译器是否实现要注册的指针取决于平台是否支持指向寄存器的指针,或者寄存器是否映射到内存。在有些平台上,某些寄存器被映射为内存。
当编译器遇到POD变量声明时,编译器可以为该变量使用寄存器。但是,如果平台不支持指向寄存器的指针,编译器可能会在内存中分配变量,特别是当变量的地址被取下时。
举个例子:
int a; // Can be represented using a register.
int b;
int *p_b = &b; // The "b" variable may no longer reside in a register
// if the platform doesn't support pointers to registers. 在许多常见的平台中,例如ARM处理器,寄存器位于处理器的内存区域(一个特殊的区域)。处理器中没有这些寄存器的地址行或数据线。因此,它们不会占用处理器地址空间中的任何空间。也没有ARM指令返回一个寄存器的地址。因此,对于ARM处理器,如果代码使用变量的地址,编译器将将变量的分配从寄存器更改为内存(处理器外部)。
发布于 2020-11-02 18:09:34
在CPU有内存映射寄存器的大多数情况下,使用其中一些寄存器的编译器将指定使用哪些寄存器。编译器文档中表示它不使用的寄存器可以使用volatile-qualified指针访问,就像任何其他类型的I/O寄存器一样,只要它们不以编译器不期望的方式影响CPU状态。读取编译器可能使用的寄存器通常会产生编译器生成的代码中发生的任何值,这不太可能有意义。编写编译器使用的寄存器可能会以无法有效预测的方式破坏程序行为。
https://stackoverflow.com/questions/64642525
复制相似问题