我有类似的东西
register unsigned int a, b, c;
int n;
for (n = 0; n < 10; ++n){
c = a + b
b = a
a = c
array[n] = c;
}
Run Code Online (Sandbox Code Playgroud)
它做什么,没关系.代码以现在的方式快速运行,如果删除了register关键字,则代码更慢.但是,当我在int n之前添加寄存器时,它实际上比现在运行得慢,但比没有使用寄存器时更快.
谁可以给我解释一下这个?谢谢.
dsi*_*cha 16
你是怎么计时的?在实践中,register通常什么都不做.当编译器技术非常原始并且编译器无法自己计算出寄存器分配时,这是一个很大的问题.它应该是一个为该变量分配寄存器的提示,对于非常频繁使用的变量很有用.如今,大多数编译器只是忽略它并根据自己的算法分配寄存器.
Soa*_*Box 13
register给编译器一个提示,将变量放在寄存器而不是内存/堆栈空间.在某些情况下,对于放置此关键字的每个变量,都没有足够的寄存器,因此将其置于太多变量上会导致其他一些变量再次出现在寄存器中.
这只是一个提示,编译器不必采取它.
在gcc中,寄存器绝对不会被忽略,除非你指定了优化选项。用这样的东西测试你的代码
unsigned int array[10];
int n;
#define REG register
int main()
{
REG unsigned int a, b, c;
for (n = 0; n < 10; ++n){
c = a + b;
b = a;
a = c;
array[n] = c;
}
}
Run Code Online (Sandbox Code Playgroud)
您获得(取决于 REG 是否已定义或为空)
http://picasaweb.google.com/lh/photo/v2hBpl6D-soIdBXUOmAeMw?feat=directlink
左边显示了使用寄存器的结果。
| 归档时间: |
|
| 查看次数: |
9884 次 |
| 最近记录: |