Oracle Solaris Studio 12.2:C++ 用户指南

A.2.174 –xregs=r[,r...]

为生成的代码指定寄存器的用法。

r 是一个逗号分隔列表,它包含下面的一个或多个子选项:applfloatframeptr

no% 作为子选项的前缀会禁用该子选项。

请注意,-xregs 子选项仅限于特定的硬件平台。

示例:-xregs=appl,no%float

表 A–45 -xregs 子选项

值 

含义  

appl

(SPARC) 允许编译器将应用程序寄存器用作临时寄存器来生成代码。应用程序寄存器是: 

g2、g3 或 g4(在 32 位平台上) 

g2 或 g3(在 64 位平台上) 

强烈建议使用 -xregs=no%appl 编译所有系统软件和库。系统软件(包括共享库)必须为应用程序保留这些寄存器值。这些值的使用将由编译系统控制,而且在整个应用程序中必须保持一致。

在 SPARC ABI 中,这些寄存器表示为应用程序寄存器。由于需要更少的装入和存储指令,因此使用这些寄存器可提高性能。但是,这样使用可能与某些用汇编代码编写的旧库程序冲突。

float

(SPARC) 允许编译器通过将浮点寄存器用作整数值的临时寄存器来生成代码。使用浮点值可能会用到与该选项无关的这些寄存器。如果希望您的代码没有任何对浮点寄存器的引用,需要使用 -xregs=no%float 并确保您的代码不会以任何方式使用浮点类型。

frameptr

(x86) 允许编译器将帧指针寄存器(IA32 上的 %ebp、AMD64 上的 %rbp)通用寄存器。 

缺省值为 -xregs=no%frameptr

除非也用 -features=no%except 禁用了异常,否则 C++ 编译器将忽略 -xregs=frameptr。请注意,-xregs=frameptr-fast 的一部分,但除非同时指定 -features=no%except,否则 C++ 编译器将忽略此设置。

通过 -xregs=framptr,编译器可以自由使用帧指针寄存器来改进程序性能。但是,这可能会限制调试器和性能测量工具的某些功能。栈跟踪、调试器和性能分析器不能报告用 -xregs=frameptr 编译的功能。

而且,对 Posix pthread_cancel() 的 C++ 调用将找不到清理处理程序。

如果直接调用或从 C 或 Fortran 函数间接调用的 C++ 函数会引发异常,不应该用 -xregs=frameptr 编译 C、Fortran 和 C++ 混合代码。如果使用 -fast 编译此类混合源代码,请在命令行中的 -fast 选项后添加 -xregs=no%frameptr

由于 64 位平台上的可用寄存器更多,因此相对于 64 位代码相比,使用 -xregs=frameptr 编译更容易改进 32 位代码的性能。

如果同时指定了 -xpg,编译器会忽略 -xregs=frameptr 并发出警告。

SPARC 缺省值为 -xregs=appl,float

x86 缺省值为 -xregs=no%frameptr

在 x86 系统中,-xpg-xregs=frameptr 不兼容,这两个选项不应一起使用。还请注意,-fast 中包括 -xregs=frameptr

强烈推荐您用 -xregs=no%appl,float 编译那些用于与应用程序链接的共享库的代码。至少共享库应该显式说明它如何使用应用程序寄存器,以便与这些库链接的应用程序知道这些寄存器分配。

例如,在某种全局意义上使用寄存器(例如,使用寄存器指向一些关键数据结构)的应用程序,需要确切地知道其代码未使用 -xregs=no%appl 编译的某个库如何使用应用程序寄存器,以便安全地与该库链接。