WEB开发网
开发学院软件开发C语言 简单DAG生成算法的一个性质 阅读

简单DAG生成算法的一个性质

 2009-06-03 08:30:24 来源:WEB开发网   
核心提示: 让csc编译过后就只剩下这么多了: C#代码static class TestDAG { static void Main(string[] args) { int a = 0x001001; int b = 0x010002; }}很明显如果继续用

让csc编译过后就只剩下这么多了:

C#代码   

static class TestDAG {
    static void Main(string[] args) {
        int a = 0x001001;
        int b = 0x010002;
    }
}

很明显如果继续用定义-使用关系来优化的话,整个Main()方法应该变成空的才对。

C#不允许用户对内建类型的运算符做重载,所以还好,至少System.Int32的加法运算符能保证没有可见的副作用,所以可以优化。不过试想一个这样的类:

C#代码  

public class Foo {
    int _value;
    public int Value {
        get {
            Console.WriteLine( _value );
            return _value;
        }
        set { _value = value; }
    }
}

然后要是foo是Foo的一个实例,我要是写:

C#代码   

1 + foo.Value + (1 + foo.Value)

要是被优化了的话,Console.WriteLine(_value)就只会发生一次,这就糟糕了。

GCC 4.3.0在编译这几个表达式的时候,使用-O2,对代码:

C代码  

void foo(int a, int b) {
    int i = a + b + (a + b);
    int j = a + b + a + b;
    int k = a + a + (a + a + a + (a + a + a + a));
    
    printf("%d, %d, %d, %d, %dn", a, b, i, j, k);
}

其中与i、j和k的初始化相关的表达式编译得到:

X86 assembler代码   

mov ecx,dword ptr ss:[ebp+8]             ;  ecx = a
mov ebx,dword ptr ss:[ebp+C]             ;  ebx = b
lea edx,dword ptr ds:[ebx+ecx]           ;  edx = a + b
shl edx,1                                ;  edx = 2 * edx
lea eax,dword ptr ds:[ecx+ecx*2]         ;  eax = a + 2 * a
lea eax,dword ptr ds:[eax+eax*2]         ;  eax = eax + 2 * eax

优化得相当彻底。此时i和j都由edx表示。

事实上不加上输出语句的话,整个foo()就没了 = =

上一页  4 5 6 7 8 9 

Tags:简单 DAG 生成

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接