龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

Viusal C++.NET的优化代码(2)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
使用"/arch:SSE2"的话,可以得到所有"/arch:SSE"选项的效果,另外还有以下几个效果: 1。在使用双精度浮点数时,使用SSE2指令对其处理。 2。使SSE2指令集做

  使用"/arch:SSE2"的话,可以得到所有"/arch:SSE"选项的效果,另外还有以下几个效果:

  1。在使用双精度浮点数时,使用SSE2指令对其处理。

  2。使SSE2指令集做64位切换。(原文:Making use of SSE2 instructions for 64-bit shifts)

  还有其它的好处,在同时使用"/arch:SSE"或"/arch:SSE2” 和 "/GL"(全程优化)选项选项时,编译器会对浮点参数和浮点返回值做函数调用规则优化。

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

精彩图集

赞助商链接