在普通的C++下就算把代码优化到极致依旧想提升性能怎么办,那么就把目光投向元模版编程上面了,在编译期间展开的计算方式可以大大降低同样问题计算下的计算量
C++ 模板最初是为实现泛型编程设计的,但是发现原模版编程是图灵完备的(Turing-complete),也就是说,利用元模版编程可以完成任何计算,但是设计之初并不是为了这个,算是意外之喜吧,但是由于开始设计的原因,所以造成了元模版实现的代码很丑陋,属于函数编程的一种
代码如下:
#include//模板元编程冒泡排序 //函数①,比较两个数字,并交换两个数字 template void Swap(int* data) { if(data[i]>data[j]) std::swap(data[i], data[j]); } //函数②,将进行一次冒泡排序,将一元素放于末端 template void BubbleSort(int* data) { // 一次冒泡 Swap (data); //将j和j+1比较并交换 BubbleSort (data); //将j和j+1传入本函数②中进行比较 } //函数③,当j void BubbleSort<0, 0>(int*) { } //函数④,当展开大小为n的时候 template void BubbleSort(int* data) { BubbleSort (data); //直接进入本函数④继续展开 BubbleSort (data); //展开0到n-1的函数,展开后进入③ } //函数⑤,当展开到剩下1的时候停止展开 template<> void BubbleSort<1>(int* data) { } int main() { int inidata[10] = { 3,4,2,1,5,5,9,2,0,4 }; BubbleSort<10>(inidata); //将数组开始展开 for(int i=0;i<10;i++) { std::cout< 在以上函数中,比普通版本的冒泡排序用时少了一倍,但是在编译时期展开费时间,而且展开后会造成生成文件大,在一些特定场景下以空间换时间还是非常值得的
另外这个函数可以将BubbleSort中的函数直接变为inline函数,直接将代码展开到函数内部,从而避免函数调用的开销从而达到极致的时间开销
#include//模板元编程冒泡排序 //函数①交换两个数字 template void inline Swap(int* data) { if(data[i]>data[j]) std::swap(data[i], data[j]); } //函数②,将进行一次冒泡排序,将一元素放于末端 template void inline BubbleSort(int* data) { // 一次冒泡,将前 i 个元素中最大的置换到最后 Swap (data); BubbleSort (data); } //函数③ template<> void inline BubbleSort<0, 0>(int*) { } //函数④,当展开大小为n的时候 template void BubbleSort(int* data) { BubbleSort (data); //直接进入本函数④继续展开 BubbleSort (data); //展开0到n-1的函数,展开后进入③ } //函数⑤,当展开到剩下1的时候结束 template<> void inline BubbleSort<1>(int* data) { } int main() { int sdata[10] = { 3,4,2,1,5,5,9,2,0,4 }; BubbleSort<10>(sdata); //将数组开始展开 for(int i=0;i<10;i++) { std::cout<



