是否可以禁止在一小段C ++代码中使用某些寄存器?

时间:2016-09-26 06:06:32

标签: c++ g++

我已经查看了enter image description here,但由于以下原因,这两种解决方案都不适合我。

  1. 我试图阻止c ++代码触及寄存器,而不是汇编,因此clobber列表将不起作用。
  2. 我想在本地执行此操作,而不是全局执行,因此全局显式寄存器变量过于沉重。
  3. 是否可以用某种方式包装一组c ++语句来告诉编译器不使用某些寄存器?

2 个答案:

答案 0 :(得分:1)

当然不是以便携式方式。 C ++语义级别对此注册事物一无所知(尽管有register个关键字)。

g++例如can allocate a register globallylocally变量,在这种情况下,编译器永远不会触及该寄存器。这有时可能很有用(我已经在VM中使用了这种方法,以获得Lisp实现的严重性能,而无需手动编写程序集中的所有内容)。

我当然怀疑除非您重新编译所有标准库,否则更改标准头文件以包含库中代码可以触及寄存器的声明(并且根据ABI,您可能需要的寄存器)使用声明"刮擦"因此不保存和恢复。

也许其他编译器也有这个选项(clang但是例如尽管几乎与g ++兼容,支持寄存器分配)。

答案 1 :(得分:0)

不,C ++下面有一个相当简单的模型。

如果你考虑一下C ++编译器如何知道要编译的寄存器?

如果不钻研汇编程序,你将无法做到这一点。

因为你想要阻止使用某些寄存器,所以你需要从你想要禁止那些寄存器的点开始编写代码,以便不再需要这些寄存器 - 这可能是很多代码。

如果没有更多详细信息,说明为什么要阻止访问某些寄存器以及预防的时间长短,那么我所能给出的只是模糊的一般性。