"pointer to register variable" 作为函数参数有什么作用?
What does "pointer to register variable" as function parameter do?
据我了解,register
说明符提示编译器将变量存储在寄存器中。这一切都很好,直到我在 Xorg-7.7 的 XKBlib.h
中遇到以下声明:
extern int XkbTranslateKeySym(
Display * /* dpy */,
register KeySym * /* sym_return */,
unsigned int /* modifiers */,
char * /* buffer */,
int /* nbytes */,
int * /* extra_rtrn */
);
注意 sym_return
如何作为 指针传递给注册变量 。让我想知道的是
- 这似乎是允许的,尽管不可能获取寄存器变量的地址,
- 在函数声明中提及这似乎很重要。
第 1 点似乎在某种程度上无效,因为我似乎能够将指针传递给非 register
变量,即使 GCC 有 -pedantic-errors
标志。
那么,与省略 register
关键字的声明相比,此声明有何变化?它会改变调用约定还是什么?
这不是获取寄存器变量的地址,即它不是指向寄存器变量的指针。相反,它暗示指针本身(记住,指针只是变量)应该放在寄存器中。
register
关键字在现代 C 中主要是一个过时的特性。它做了两件事:
- 告诉编译器,如果可能,它应该尝试将变量存储在 CPU 寄存器中。如今,编译器比程序员更适合进行此类调用,因此功能已过时。
- 阻止程序员获取变量的地址。
在你的情况下,它说指针 本身 ,而不是 pointed-at 数据,最好存储在寄存器中,大概是 address/index登记。从标准的 C 视图来看,它不会做任何其他事情。
可能是某些奇异的编译器在给定 register
作为函数的一部分时选择了某种调用约定,尽管我以前从未见过。调用约定的实践类似于:"if parameter n is a pointer, store it in index register x, if parameter n+1 is a pointer, store it index register y" 等。
我怀疑此处 register
关键字最可能的解释是程序员不知道他们在做什么。特别是因为在 header 中没有留下关于它的评论 - 这是一个相当肯定的无能迹象。从整体上看 header,还有很多其他迹象支持无能理论,例如这个明显的错误:#define XkbLC_BeepOnComposeFail (1<<31)
。当您在简单查看源代码的几分钟内找到 UB 时,请远离它。
据我了解,register
说明符提示编译器将变量存储在寄存器中。这一切都很好,直到我在 Xorg-7.7 的 XKBlib.h
中遇到以下声明:
extern int XkbTranslateKeySym(
Display * /* dpy */,
register KeySym * /* sym_return */,
unsigned int /* modifiers */,
char * /* buffer */,
int /* nbytes */,
int * /* extra_rtrn */
);
注意 sym_return
如何作为 指针传递给注册变量 。让我想知道的是
- 这似乎是允许的,尽管不可能获取寄存器变量的地址,
- 在函数声明中提及这似乎很重要。
第 1 点似乎在某种程度上无效,因为我似乎能够将指针传递给非 register
变量,即使 GCC 有 -pedantic-errors
标志。
那么,与省略 register
关键字的声明相比,此声明有何变化?它会改变调用约定还是什么?
这不是获取寄存器变量的地址,即它不是指向寄存器变量的指针。相反,它暗示指针本身(记住,指针只是变量)应该放在寄存器中。
register
关键字在现代 C 中主要是一个过时的特性。它做了两件事:
- 告诉编译器,如果可能,它应该尝试将变量存储在 CPU 寄存器中。如今,编译器比程序员更适合进行此类调用,因此功能已过时。
- 阻止程序员获取变量的地址。
在你的情况下,它说指针 本身 ,而不是 pointed-at 数据,最好存储在寄存器中,大概是 address/index登记。从标准的 C 视图来看,它不会做任何其他事情。
可能是某些奇异的编译器在给定 register
作为函数的一部分时选择了某种调用约定,尽管我以前从未见过。调用约定的实践类似于:"if parameter n is a pointer, store it in index register x, if parameter n+1 is a pointer, store it index register y" 等。
我怀疑此处 register
关键字最可能的解释是程序员不知道他们在做什么。特别是因为在 header 中没有留下关于它的评论 - 这是一个相当肯定的无能迹象。从整体上看 header,还有很多其他迹象支持无能理论,例如这个明显的错误:#define XkbLC_BeepOnComposeFail (1<<31)
。当您在简单查看源代码的几分钟内找到 UB 时,请远离它。