Copyright (c) prototype, all rights reserved。
在不对原文内容(包括作者信息)做任何改动的前提下,欢迎自由转载。
两年多前写的内部资料。现在自己把它翻成中文,贴到我的blog上来。
近来闲暇时,我用C++和表达式模板(expression template)技术实现了一个复数类(注意:是类,而不是类模板)— Complex。在类型上,它相当于std::complex<float>,但它可以很容易通过一个typedef变成一个与std::complex<double> 或 std::complex<long double>相当的类。在功能上,它实现了各种运算符重载和各种函数。最初设计和实现这个类的目的只是单纯的为了好玩,顺便温故一下已经许久没碰过的表达式模板技术。在一切必要的功能都实现完毕后,我想到和std::complex比较一下运行速度,结果却令人非常吃惊。原始结果直接copy/paste在下面。
一些说明:
1.测试条件:运行平台为PIII 750,WinXP Home/Cygwin。编译器为gcc 3.3.2。优化条件为 -O3 -NDEBUG。
2.程序输出格式举例说明如下:
complex += complex ======
// 表示比较的内容为:+= 运算符。
Complex
370
// 表示完成一定数目(10000000)运算,Complex所需要的tick数(越小越好/快)。
std::complex<Real>
331
// 表示完成相同数目的运算,std::complex<float> 所需要的tick数。Real 其实就是float的一个typedef。
测试结果:
complex += complex ======