在C编程语言中,哪些(即微处理器的寄存器)是寄存器存储类变量存储的?

时间:2018-04-05 14:55:54

标签: c cpu-registers microprocessors storage-class-specifier

寄存器存储类的任何固定寄存器

2 个答案:

答案 0 :(得分:4)

* BADI SCD_CREATE: SET_SHIPMENT_COST_TYPE CALL FUNCTION 'SD_SCD_GET_INSTANCE' EXPORTING i_badi = co_badi_scd_create CHANGING c_interface_ref = l_badi_create EXCEPTIONS OTHERS = 1. IF sy-subrc IS INITIAL. CALL METHOD l_badi_create->set_shipment_cost_type EXPORTING i_refobj = i_refobj CHANGING c_fkart = e_tvtf-fkart. ENDIF. 是编译器的建议可能希望将指定的变量放在寄存器中。

它不是必须将它放入寄存器的命令。

编译器可以选择将变量放入哪个寄存器,或完全忽略该建议。

答案 1 :(得分:3)

在上个世纪,register是一个提示,编译器试图将该变量放在processor register中。

今天,在大多数编译器上,这个提示几乎被忽略了。但是仍然不允许使用声明为&的变量的地址(使用register一元运算符)。所以今天register意味着"我不会接受该变量的地址"到编译器(因此,register存储类几乎从未在最近编写的代码中使用过。有些人认为register可能会在未来的标准(C& C ++)中被弃用,或者该关键字会被重复用于其他目的。

Optimizing compilers有复杂的register allocationinstruction scheduling(另见this)。细节取决于优化级别,目标处理器instruction set architectureABI等等......因此可以完全忽略给定变量(如果编译器不需要) it),或者可以坐在寄存器中,或者可以坐在call stack等...(并且该状态可能因编译函数的不同点而有所不同)。

使用GCC,您可以使用foo.c编译gcc -O -fverbose-asm -S foo.c文件并查看生成的foo.s汇编程序文件(您可以vary优化级别,例如-O2等......)。

关于性能,今天CPU cache很重要,不仅仅是注册。