Visual C++ .NET 2002
VC.NET 2002引入了全程优化(Whole Program Optimization,缩写为WPO)的概念,“/GL”选项代表使用全程优化。全程优化意味着:编译器在.obj文件中存放的是代码的中间表达而不是目标代码,在连接时连接器对其优化处理并生成真正的目标代码。
全程优化的一个主要好处在于我们可以跨越源文件进行函数内联,这将大大提高程序的性能。还有一个好处在于编译器可以跟踪内存和寄存器的使用,以便优化使函数调用的开销更小。
下面的代表展示了全程优化的表现:
// File 1 extern void func (int *, int *); int g, h; int main() { int i = 0; int j = 1; g = 5; h = 6; func(&I, &j); g = g + i; h = h + i; return 0; } // File 2 extern int g; extern int h; void func(int *pi, int *pj) { *pj = g; h = *pi; }
|
当不使用“/GL”选项时,生成了如下代码:
sub esp, 8 lea eax, DWORD PTR _j$[esp+8] push eax lea ecx, DWORD PTR _i$[esp+12] push ecx mov DWORD PTR _i$[esp+16], 0 mov DWORD PTR _j$[esp+16], 1 mov DWORD PTR ?g@@3HA, 5 mov DWORD PTR ?h@@3HA, 6 call ?func@@YAXPAH0@Z mov eax, DWORD PTR _i$[esp+16] mov edx, DWORD PTR ?g@@3HA mov ecx, DWORD PTR ?h@@3HA add edx, eax add ecx, eax mov DWORD PTR ?g@@3HA, edx mov DWORD PTR ?h@@3HA, ecx xor eax, eax add esp, 16 ret 0
|
当使用了“/GL”时,你会看到下面的代码,现在的代码短多了。注意编译这个例子时同样要注意关掉内联优化。
sub esp, 8 lea ecx, DWORD PTR _j$[esp+8] lea edx, DWORD PTR _i$[esp+8] mov DWORD PTR _i$[esp+8], 0 mov DWORD PTR ?g@@3HA, 5 mov DWORD PTR ?h@@3HA, 6 call ?func@@YAXPAH0@Z mov DWORD PTR ?g@@3HA, 5 xor eax, eax add esp, 8 ret 0
|
(责任编辑 火凤凰 sunsj@51cto.com TEL:(010)68476636-8007)