什么是一个很好的例子,注册的变量使用在C?
-
10-07-2019 - |
题
我读通过K&R并来到了小部分对登记册的变量,并想知道如果这里的人们有一些很好的例子,这付诸实践。
从第4.7节K&R:
登记册宣言》看起来像
注册int x;
注册char c;
到是清楚的,我只是希望看到一些很酷的代码样本。I(我确信I)了解该主题,所以不觉得有必要类型的详细解释(除非你想要的)。
解决方案
没有良好的例的注册使用情况时,使用现代化的汇编者(阅读:过去15年以上),因为它几乎从来没有任何好处的,可以做一些坏。当你使用注册,你告诉编译器"我知道如何优化我的代码比你做得更好",这是几乎从来没有的情况。一个三件事情可以发生在你使用注册:
- 编译器忽略它,这是最有可能的。在这种情况下,唯一伤害是你不能把地址的变量的代码。
- 编译器的荣誉,你的请求和结果是代码的运行速度较慢。
- 编译器荣誉,你的要求和代码的运行速度更快,这是最不可能的情况。
即使一个编译器产生更好的代码时使用注册,没有理由相信另一个也将这样做。如果你有一些关键的代码编译器不是最优化的不够好你最好的赌注是可能使用的汇编为一部分,但无论如何,当然不适当的分析验证产生的代码确实是一个问题第一次。
其他提示
在一般我与罗伯特<同意/ A>,但任何好的规则这其中有例外,以及。结果 如果你工作的深嵌入式系统你可能知道的比编译器更好如何优化您的特定应用程序的代码在特定硬件架构。
但是,在的情况下,罗伯茨解释好为嵌入式字99%为好。
我知道这是从相当长的一段时间,但这里是从堆排序一个子过程,其中使用寄存器变量使得算法更快,至少使用gcc 4.5.2编译代码的实现
inline void max_heapify(int *H, int i){
char OK = FALSE;
register int l, r, max, hI;
while(!OK){
OK = TRUE;
l = left(i);
r = right(i);
max = i;
if(l <= H[SIZE] && H[l] > H[i]){
max = l;
}
if(r <= H[SIZE] && H[r] > H[max]){
max = r;
}
if(max != i){
OK = FALSE;
hI = H[i];
H[i] = H[max];
H[max] = hI;
i = max;
}
}
}
我测试algortihm具有和不具有属性之前寄存器关键字并执行它与在我的笔记本50000000个元件,几次每个版本排序随机阵列。
寄存器的使用从〜135S至〜125S掉线的堆排序的时间。
我也只有5000000个元件测试,但更多次执行它。
而不寄存器中的版本开始在11S但每个执行降低的时间,直到达到9,65s并停止在它
与所述寄存器中的版本开始在10秒和下降的时间,直到8,80s。
我认为这是与高速缓存存储器。然而看来寄存器使算法更快由constanct因子
由于这些变量算法沿颇多使用,确保它们在寄存器中,而不离开这个工作,导致在这种情况下一个更好的结果的编译器。然而,它并没有改善时那么多。
希望车辕将有助于某人,问候。
另一种常见的情况下是执行低级别的口译时。保持在寄存器中的一些状态,例如。虚拟机的堆栈指针,可以显著减少存储器访问和加快您的代码。
请参阅 VMGEN - 高效的虚拟机解释的发电机的用于优化(5.2栈顶缓存)的一个例子。
首先是,寄存器变量应该是使用对频繁使用的变量,如循环控制变量通过最小化访问时间,以提高性能。二级你只能用,只有在这种情况下,寄存器存储说明符 喜欢,好玩(自动INT一个,自动INT B):错误 有趣(INT注册一个,注册INT B):右只这将运行 有趣(静态INT一,静态INT B):错误 有趣(INT的extern一个,的extern INT B):错误
好这是因为有多个编码contexes需要多个答案一个问题:从高级语言的角度看,中间级和低电平由于C语言可以调用组件例程(至组件)
。之所以使用汇编代替C是因为SOZ发展过程中遇到的性能问题exavtly是有必要的register关键字,但没有它不工作按预期在许多情况下,开发商