寄存器存储类的任何固定寄存器
答案 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 allocation和instruction scheduling(另见this)。细节取决于优化级别,目标处理器instruction set architecture,ABI等等......因此可以完全忽略给定变量(如果编译器不需要) it),或者可以坐在寄存器中,或者可以坐在call stack等...(并且该状态可能因编译函数的不同点而有所不同)。
使用GCC,您可以使用foo.c
编译gcc -O -fverbose-asm -S foo.c
文件并查看生成的foo.s
汇编程序文件(您可以vary优化级别,例如-O2
等......)。
关于性能,今天CPU cache很重要,不仅仅是注册。