ZHCUAU3J January 2018 – March 2024
C/C++ 编译器对寄存器变量(用 register 关键字定义的变量)的处理方式不同,具体取决于您是否使用 --opt_level (-O) 选项。
编译器会忽略任何寄存器定义,并使用能够充分利用寄存器的算法将寄存器分配给变量和临时值。
如果您使用 register 关键字,则可以建议将变量作为分配到寄存器的候选对象。编译器使用与分配寄存器变量时所用的同一组寄存器来分配临时表达式结果。
编译器尝试遵守所有寄存器定义。如果编译器将合适的寄存器耗尽,它会通过将寄存器内容移动到存储器来释放寄存器。如果您将太多对象定义为寄存器变量,则会限制编译器具有的用于临时表达式结果的寄存器数量。此限制会导致寄存器内容过多地移动到存储器中。
任何具有标量类型(整数、浮点或指针)的对象都可以被定义为寄存器变量。对于其他类型的对象(例如数组),将忽略寄存器指示符。
寄存器存储类对参数和局部变量都有意义。通常,在函数中,一些参数会被复制到堆栈上的某个位置,并在函数体内的这个位置被引用。编译器将寄存器参数复制到寄存器而不是堆栈中,从而加快对函数内参数的访问。
有关寄存器惯例的更多信息,请参阅节 6.3。