简单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()就没了 = =
更多精彩
赞助商链接