Viusal C++.NET的优化代码
2008-11-24 19:37:31 来源:WEB开发网上面说的几点优化特性已经包括于VC.NET 2003里了。另外还有一点就是能消除"死参数"--从没被用过的参数。比如:
int
f1(int i, int j, int k)
{
return i + k;
}
int
main()
{
int n = a+b+c+d;
m = f1(3, n, 4);
return 0;
}
在函数f1()中,第二个参数从没被使用过。当我们用"/GL"(全程优化)选项时,编译器将产生如下目标代码来调用f1():
mov eax, 4
mov ecx, 3
call ?f1@@YAHHHH@Z
mov DWORD PTR ?m@@3HA, eax
在这个例子里,变量"n"从没被运算,只有两个参数被f1()使用,所以只传递那两个参数(并且它们是从寄存器传过去的,这比使用栈传更快)。另外,编译这个例子时要禁止内联(inlining),否则函数f1()就不存在了,而直接给m赋予值7。
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
- ››优化精髓之商业性网站常遇见的问题和误区
- ››Netpas加速 让非电信宽带用户流畅上网
- ››net中fckediter的图片上传时候点击\浏览服务器\出...
- ››优化增强您的Visual C++应用程序
- ››Netmsg局域网聊天程序
- ››NetAirus指控苹果iPhone侵犯其专利
- ››优化Windows 7错误报告弹出提示窗口
- ››优化您的 Apache Geronimo 发行版
- ››Netflix 在线影视播放程序将登陆 iPhone
- ››优化迅游设置,台服魔兽全面加速
- ››Net中各种不同的对象创建方式的速度差异
- ››NetNewsWire 功能简单 界面快速 Reader 浏览器
更多精彩
赞助商链接