摘要:演示了Visual C++ 2003 编译器提供的众多代码优化功能中的几项功能。
Microsoft Visual C++ Toolkit 2003 包含优化 C++ 编译器。大多数开关相当简明,并且已经在 Visual C++ 产品的多个版本中存在,但仍然有两个开关比较新,并且无须重写代码就能够显著提高速度。它们是 /GL (Whole Program Optimization) 和 /G7(它能产生为 Pentium 4 或 AMD Athlon 优化的代码)。还有一个选项 /arch:SSE2,它能产生针对 SSE2 寄存器和指令而优化的代码。
示例代码经过了三项测试:
1.调用作为内联候选函数的函数。
2.执行大量浮点乘法和加法运算。
3.执行大量整数乘法和加法运算。
完整程序优化
示例代码定义了两个非常类似的函数:Add() 和 DisplayAdd()。DisplayAdd() 会显示到屏幕,因此不太可能被内联:
void DisplayAdd(int a, int b)
{
cout << a << " + " << b << " = " << a + b << endl;
cout << "Return address from " << __FUNCTION__
<< " " << _ReturnAddress() << endl;
}
_ReturnAddress 是一个内部函数,它报告控制将在何处返回。可使用它来标识内联函数。
Add() 在 gl-g7.cpp 中声明,同时还声明一个由它设置的全局变量:
void* inlineReturnAddress; // set in Add()
int Add(int a, int b); // implementation in module.cpp
实现位于 module.cpp 中:
int Add(int a, int b)
{
inlineReturnAddress = _ReturnAddress();
return a+b;
}
要编译该程序且不使用 Whole Prgram Optimization,请使用以下命令行:
cl /O2 /ML /EHsc GL-G7.cpp module.cpp
要运行测试 1,请使用以下命令:
gl-g7 1
应该看到与以下内容类似的输出(数值地址会有所不同):
1 + 2 = 3
Return address from DisplayAdd 00401D0A
1 + 2 = 3
Return address from Add 00401D13
Return address from Test1 00402125
Add() 的返回地址与 Test1() 的返回地址不同:Add() 没有被内联。
现在,使用 /GL 重新编译:
cl /O2 /ML /EHsc /GL GL-G7.cpp module.cpp
再次运行测试 1,应该看到如下所示的输出:
1 + 2 = 3
Return address from DisplayAdd 00401242
1 + 2 = 3
Return address from Add 0040179F
Return address from Test1 0040179F
现在,Add() 和 Test1() 的返回地址相同:Add() 在 Test1() 内部内联,即使它的代码来自另一个文件。