打印

不同编译器会这样优化变量吗,如何优化

[复制链接]
2869|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
singleywy|  楼主 | 2011-3-15 12:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 singleywy 于 2011-3-15 12:34 编辑

我在编程的时候遇到了这样的问题,即变量的作用域问题;
请问你们的编译器,怎么处理这两个变量i,j的,编译器,是将i,j分配不同的空间,还是同一空间,大家探讨一下
情形0:
char delay()
{
         char i,j;
         for(i=8;i>0;i--);
         for(j=9;j>0;j--);
}
情形1:
char delay()
{
       char i;
       for(i=8;i>0;i--);
       {
                char j;
                for(j=9;j>0;j--);
       }
}
情形2:
char delay()
{
       {
             char i;
              for(i=8;i>0;i--);
        }
        {
              char j;
              for(j=9;j>0;j--);
        }
}

相关帖子

沙发
lelee007| | 2011-3-15 12:25 | 只看该作者
三种情形都是8+9的循环,不知道LZ是什么意思咧?

使用特权

评论回复
板凳
singleywy|  楼主 | 2011-3-15 12:30 | 只看该作者
2# lelee007
我只是举了简单的例子供大家探讨一下,编译器会如何处理这两个变量,从原理上i,j都可以使用同一个存储空间,不过编译器在不同情形下,是将i,j放在同一空间,还是分配不同的空间,这涉及到编译器的优化问题;
您说编译器会如何优化?

使用特权

评论回复
地板
快乐唯有你| | 2011-3-15 12:30 | 只看该作者
变量的作用域仅限于距离最近的两个括号之间

使用特权

评论回复
5
sdpz| | 2011-3-15 12:40 | 只看该作者
不一定占用栈空间啊,不要忘记了累加器,有累加器的话会使用累加器,有支持累加的寄存器也可能会用上。
对于情况1,在C51里很有可能第一个循环只占用了一字节ram,而里面的循环只使用累加器。

使用特权

评论回复
6
singleywy|  楼主 | 2011-3-15 12:55 | 只看该作者
5# sdpz
恩,情形1,编译器仅使用了1字节,keil反汇编之后,使用的是R7

使用特权

评论回复
7
singleywy|  楼主 | 2011-3-15 13:02 | 只看该作者
不同的情形,KEIL编译器反汇编不同,有些地方甚至显得费解;
情形0:
        RSEG  ?PR?main?MAIN
main:
        USING        0
                        ; SOURCE LINE # 131
; {
                        ; SOURCE LINE # 132
;         char i,j;
;         for(i=8;i>0;i--);
                        ; SOURCE LINE # 134
;---- Variable 'i?741' assigned to Register 'R7' ----
        MOV          R7,#08H
?C0025:
        DJNZ         R7,?C0025
?C0026:
;         for(j=8;j>0;j--);       
                        ; SOURCE LINE # 135
;---- Variable 'j?742' assigned to Register 'R7' ----
        MOV          R7,#08H
?C0028:
        DJNZ         R7,?C0028
i,j都分配给了R7;
情形1:
        RSEG  ?PR?main?MAIN
main:
        USING        0
                        ; SOURCE LINE # 131
; {
                        ; SOURCE LINE # 132
;         char i;
;         for(i=8;i>0;i--);
                        ; SOURCE LINE # 134
;---- Variable 'i?742' assigned to Register 'R7' ----
        MOV          R7,#08H
?C0025:
        DJNZ         R7,?C0025
?C0026:
; //        for(j=8;j>0;j--);       
; /*
;         {
;                 char i;
;                 for(i=8;i>0;i--);
;         }
; */       
;         {
                        ; SOURCE LINE # 142
;                 char j;
;                 for(j=8;j>0;j--);
                        ; SOURCE LINE # 144
        MOV          j?741,#08H
?C0028:
        DJNZ         j?741,?C0028
i,分配给了R7,j分配了地址空间
情形2:
RSEG  ?PR?main?MAIN
main:
        USING        0
                        ; SOURCE LINE # 131
; {
                        ; SOURCE LINE # 132
; //        char ij;
; //        for(i=8;i>0;i--);
; //        for(j=8;j>0;j--);       
;
;         {
                        ; SOURCE LINE # 137
;                 char i;
;                 for(i=8;i>0;i--);
                        ; SOURCE LINE # 139
        MOV          i?741,#08H
?C0025:
        DJNZ         i?741,?C0025
?C0026:
;         }
                        ; SOURCE LINE # 140
;        
;         {
                        ; SOURCE LINE # 142
;                 char j;
;                 for(j=8;j>0;j--);
                        ; SOURCE LINE # 144
        MOV          j?742,#08H
?C0028:
        DJNZ         j?742,?C0028
i,j都分配地址空间

使用特权

评论回复
8
singleywy|  楼主 | 2011-3-15 13:05 | 只看该作者
当keil面对情形0,变得智能了,自动优化i,j
当Keil面对情形1、2,即人工给他优化向keil表明,i,j可以使用同一空间,这时的KEIL反而变得适得其反了,将i,j分配给了不同的地址空间,既不使用寄存器,也不共用一个地址空间

使用特权

评论回复
9
singleywy|  楼主 | 2011-3-15 13:13 | 只看该作者
所以我感觉,有时候,人傻一点也好,编译器主动帮我们思考一些细节的问题,有时候我们协助编译器优化,反而编译器不识我们这一套,使我们弄巧成拙了,大家有何感想呀?

使用特权

评论回复
10
ayb_ice| | 2011-3-15 13:39 | 只看该作者
这个完全取决于编译器

使用特权

评论回复
11
singleywy|  楼主 | 2011-3-15 13:44 | 只看该作者
10# ayb_ice
所以,我想知道,我们如何编写通用性程序,让不同的编译器能得到优化

使用特权

评论回复
12
ayb_ice| | 2011-3-15 13:57 | 只看该作者
这个是局部变量,几乎没有办法控制优化的,
不过对于具体上面的这个问题,应该所有的编译器都可以优化
有一些优化的写法,一般是针对具体的编译器的,移植不行的
基本的写法,一般编译器都可以优化

使用特权

评论回复
13
xmar| | 2011-3-15 23:01 | 只看该作者
char delay()
{
     char i,j;
    #program omp parallel sections
    {
        #program omp section
         for(i=8;i>0;i--);
        #program omp section
         for(j=9;j>0;j--);
    }
    //这样更快
}

使用特权

评论回复
14
hzt818| | 2011-3-16 09:05 | 只看该作者
情形1:
char delay()
{
       char i;
       for(i=8;i>0;i--);
       {
                char j;
                for(j=9;j>0;j--);
       }
}

i, j 如果是用同一个位置, 那你们真是强人!

使用特权

评论回复
15
hzt818| | 2011-3-16 10:22 | 只看该作者
这个是局部变量,写程序的人几乎没有办法控制优化的,也不必控制优化。 那是写编译器的人的事情!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

295

帖子

3

粉丝