WEB开发网
开发学院软件开发VC Viusal C++.NET的优化代码 阅读

Viusal C++.NET的优化代码

 2008-11-24 19:37:31 来源:WEB开发网   
核心提示: 上面说的几点优化特性已经包括于VC.NET 2003里了,另外还有一点就是能消除"死参数"--从没被用过的参数,Viusal C++.NET的优化代码(3),比如: intf1(int i, int j, int k){return i + k;}intmain(){i

上面说的几点优化特性已经包括于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

上一页  1 2 3 

Tags:Viusal NET 优化

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