mandala 发表于 2017-7-8 10:40:18

关于register关键词,小甲鱼是不是讲错了

第七章 函数08(新版)里的,抄的小甲鱼的代码。用不用register关键词,汇编代码都一毛一样。

alltolove 发表于 2017-7-8 11:00:28

电脑寄存器都被用上了,就没用了

mandala 发表于 2017-7-8 11:16:14

alltolove 发表于 2017-7-8 11:00
电脑寄存器都被用上了,就没用了

可是我是抄小甲鱼的代码,为什么他的变快了,我的不行呢?
我要怎么改才能像他的那样?

ba21 发表于 2017-7-8 13:41:29

视频教程中已经讲得很明白了哦 !register是非常有限的,定义了不代表一定就会使用。没使用的情况下跟没加是一样的。

mandala 发表于 2017-7-8 13:51:10

ba21 发表于 2017-7-8 13:41
视频教程中已经讲得很明白了哦 !register是非常有限的,定义了不代表一定就会使用。没使用的情况下跟没加 ...

我就是想不通
为什么同样的代码他视频上有效,而在我电脑运行上无效?{:10_250:}
我要怎么改才能像他运行时的那样?
求解惑。

ba21 发表于 2017-7-8 13:58:27

mandala 发表于 2017-7-8 13:51
我就是想不通
为什么同样的代码他视频上有效,而在我电脑运行上无效?
我要怎么改才能像他运 ...

都说得很清楚了register是非常有限的。

register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。注意是尽可能,不是绝对。你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很多很多register 变量,它累死也可能不能全部把这些变量放入寄存器吧,轮也可能轮不到你。

mandala 发表于 2017-7-8 13:59:41

mandala 发表于 2017-7-8 13:51
我就是想不通
为什么同样的代码他视频上有效,而在我电脑运行上无效?
我要怎么改才能像他运 ...

我只是想看看编译器处理register,将变量保存在寄存器中后,翻译的汇编代码是怎样的,虽然大概能够想象到,但就是想亲眼看到。{:10_269:}

mandala 发表于 2017-7-8 14:14:39

ba21 发表于 2017-7-8 13:58
都说得很清楚了register是非常有限的。

register:这个关键字请求编译器尽可能的将变量存在CPU内部寄 ...

你能指导下 怎么样才能让register生效,使变量被保存在CPU的寄存器中 吗?我想看下它的汇编代码。

求道于盲 发表于 2017-7-8 14:19:20

看不到
这个关键字是vc下是被忽略的
编译器当成没看到

ba21 发表于 2017-7-8 14:23:12

mandala 发表于 2017-7-8 14:14
你能指导下 怎么样才能让register生效,使变量被保存在CPU的寄存器中 吗?我想看下它的汇编代码。

少运行点程序,在纯DOS下试试。 估计你也看不明白{:10_247:}

mandala 发表于 2017-7-8 14:27:58

求道于盲 发表于 2017-7-8 14:19
看不到
这个关键字是vc下是被忽略的
编译器当成没看到

小甲鱼老师用的vc6(我的也是vc6),他在视频上说register后速度变快了,你俩说的矛盾了。{:10_249:}

求道于盲 发表于 2017-7-8 14:30:18

mandala 发表于 2017-7-8 14:27
小甲鱼老师用的vc6(我的也是vc6),他在视频上说register后速度变快了,你俩说的矛盾了。

你自己也看到了
汇编代码是一样的
程序能怎么变快
无中生有?

mandala 发表于 2017-7-8 14:32:03

求道于盲 发表于 2017-7-8 14:30
你自己也看到了
汇编代码是一样的
程序能怎么变快


嗯 可能是小甲鱼老师讲错了吧

人造人 发表于 2017-7-8 15:18:49

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

人造人 发表于 2017-7-8 15:21:20

再加一张图

小甲鱼 发表于 2017-7-8 15:23:13

mandala 发表于 2017-7-8 14:27
小甲鱼老师用的vc6(我的也是vc6),他在视频上说register后速度变快了,你俩说的矛盾了。

建议看新版的《带你学C带你飞》,这个关键词有强调过是没啥用的,因为通常情况下编译器会直接替你做主。

回忆一遥远 发表于 2017-7-8 19:22:21

register 用不用主要还是编译器决定的, 只不过使用 register 关键词,编译器可能会按你的要求放在寄存器里。不同的编译器做法也不同。

mandala 发表于 2017-7-9 09:49:59

人造人 发表于 2017-7-8 15:18
Visual Studio 2017 下,开O1优化




想不到是拿esi,edi这种存偏移地址的寄存器啊,我本来以为是用eax,ecx,edx呢。
受教了。

mandala 发表于 2017-7-9 09:52:17

本帖最后由 mandala 于 2017-7-9 09:56 编辑

小甲鱼 发表于 2017-7-8 15:23
建议看新版的《带你学C带你飞》,这个关键词有强调过是没啥用的,因为通常情况下编译器会直接替你做主。

那个vim的操作令人望而却步,直接放弃了{:10_250:}

ps:这个标题党竟然吸引了这么多大佬过来,好鸡冻{:10_254:}
小甲鱼老师你好
页: [1]
查看完整版本: 关于register关键词,小甲鱼是不是讲错了