关于register关键词,小甲鱼是不是讲错了
第七章 函数08(新版)里的,抄的小甲鱼的代码。用不用register关键词,汇编代码都一毛一样。 电脑寄存器都被用上了,就没用了 alltolove 发表于 2017-7-8 11:00电脑寄存器都被用上了,就没用了
可是我是抄小甲鱼的代码,为什么他的变快了,我的不行呢?
我要怎么改才能像他的那样? 视频教程中已经讲得很明白了哦 !register是非常有限的,定义了不代表一定就会使用。没使用的情况下跟没加是一样的。 ba21 发表于 2017-7-8 13:41
视频教程中已经讲得很明白了哦 !register是非常有限的,定义了不代表一定就会使用。没使用的情况下跟没加 ...
我就是想不通
为什么同样的代码他视频上有效,而在我电脑运行上无效?{:10_250:}
我要怎么改才能像他运行时的那样?
求解惑。 mandala 发表于 2017-7-8 13:51
我就是想不通
为什么同样的代码他视频上有效,而在我电脑运行上无效?
我要怎么改才能像他运 ...
都说得很清楚了register是非常有限的。
register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。注意是尽可能,不是绝对。你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很多很多register 变量,它累死也可能不能全部把这些变量放入寄存器吧,轮也可能轮不到你。 mandala 发表于 2017-7-8 13:51
我就是想不通
为什么同样的代码他视频上有效,而在我电脑运行上无效?
我要怎么改才能像他运 ...
我只是想看看编译器处理register,将变量保存在寄存器中后,翻译的汇编代码是怎样的,虽然大概能够想象到,但就是想亲眼看到。{:10_269:} ba21 发表于 2017-7-8 13:58
都说得很清楚了register是非常有限的。
register:这个关键字请求编译器尽可能的将变量存在CPU内部寄 ...
你能指导下 怎么样才能让register生效,使变量被保存在CPU的寄存器中 吗?我想看下它的汇编代码。 看不到
这个关键字是vc下是被忽略的
编译器当成没看到 mandala 发表于 2017-7-8 14:14
你能指导下 怎么样才能让register生效,使变量被保存在CPU的寄存器中 吗?我想看下它的汇编代码。
少运行点程序,在纯DOS下试试。 估计你也看不明白{:10_247:} 求道于盲 发表于 2017-7-8 14:19
看不到
这个关键字是vc下是被忽略的
编译器当成没看到
小甲鱼老师用的vc6(我的也是vc6),他在视频上说register后速度变快了,你俩说的矛盾了。{:10_249:} mandala 发表于 2017-7-8 14:27
小甲鱼老师用的vc6(我的也是vc6),他在视频上说register后速度变快了,你俩说的矛盾了。
你自己也看到了
汇编代码是一样的
程序能怎么变快
无中生有? 求道于盲 发表于 2017-7-8 14:30
你自己也看到了
汇编代码是一样的
程序能怎么变快
嗯 可能是小甲鱼老师讲错了吧 Visual Studio 2017 下,开O1优化
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
long i;
for(i = 0; i < 0xffffff; i++)
printf("%ld ", i);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
00EC182Dpush esi
register long i;
for(i = 0; i < 0xffffff; i++)
00EC182Exor esi,esi
printf("%ld ", i);
00EC1830push esi
00EC1831push offset string "%ld " (0EC5B38h)
00EC1836call _printf (0EC127Bh)
00EC183Binc esi
00EC183Cpop ecx
00EC183Dpop ecx
00EC183Ecmp esi,0FFFFFFh
00EC1844jl main+3h (0EC1830h)
return 0;
00EC1846xor eax,eax
00EC1848pop esi
}
00EC1849ret
很明显,使用esi寄存器代替了变量i
不过,我发现即使去掉register关键字,照样使用寄存器,所以优化才是关键
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
long i;
for(i = 0; i < 0xffffff; i++)
printf("%ld ", i);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
009F182Dpush esi
long i;
for(i = 0; i < 0xffffff; i++)
009F182Exor esi,esi
printf("%ld ", i);
009F1830push esi
009F1831push offset string "%ld " (09F5B38h)
009F1836call _printf (09F127Bh)
009F183Binc esi
009F183Cpop ecx
009F183Dpop ecx
009F183Ecmp esi,0FFFFFFh
009F1844jl main+3h (09F1830h)
return 0;
009F1846xor eax,eax
009F1848pop esi
}
009F1849ret 再加一张图
mandala 发表于 2017-7-8 14:27
小甲鱼老师用的vc6(我的也是vc6),他在视频上说register后速度变快了,你俩说的矛盾了。
建议看新版的《带你学C带你飞》,这个关键词有强调过是没啥用的,因为通常情况下编译器会直接替你做主。 register 用不用主要还是编译器决定的, 只不过使用 register 关键词,编译器可能会按你的要求放在寄存器里。不同的编译器做法也不同。 人造人 发表于 2017-7-8 15:18
Visual Studio 2017 下,开O1优化
想不到是拿esi,edi这种存偏移地址的寄存器啊,我本来以为是用eax,ecx,edx呢。
受教了。 本帖最后由 mandala 于 2017-7-9 09:56 编辑
小甲鱼 发表于 2017-7-8 15:23
建议看新版的《带你学C带你飞》,这个关键词有强调过是没啥用的,因为通常情况下编译器会直接替你做主。
那个vim的操作令人望而却步,直接放弃了{:10_250:}
ps:这个标题党竟然吸引了这么多大佬过来,好鸡冻{:10_254:}
小甲鱼老师你好
页:
[1]