- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
在C中使用Lambda函数提高代码性能
在C++中使用Lambda 函数提高代码性能
学习各种外挂制作技术,马上去百度搜索 魔鬼作坊 点击第一个站进入、快
速成为做挂达人。
使编译器以及操作系统从正在创建的应用中榨取更高性能的关键在于提供充足的有关代码
意图的信息。在充分了解这个代码意图实现的功能等信息的情况下,就有可能将代码在编译
时和运行时的并行吞吐量最大化,令开发者可以将更多精力放在他们所关注的商业领域的问
题,将重量级的多核多处理器的任务计划交托给编译器,运行时库以及操作系统中的基础设
施代码来处理。
循环函数是很重要的一个环节,因为在所有可用的硬件资源中,被分离的循环中的各个
部分在一般情况下能够提供更高的应用性能。考虑这样一个小情况:迭代选定组合中的全部
元素以求得总和。最简单最直接的执行方法如下:
std::vector﹤int﹥ v;
v.push_back(1);
v.push_back(5);
int total= 0;
for (int ix = 0; ix ﹤ v.size();
++ix){
total+= v[ix];
}
以上的例子十分便于人工读写。对于熟悉C 语言家族语法的开发者而言,这个循环的
意图也十分容易理解。然而对于编译器以及运行时库的组合而言,要在多个线程之间计划好
这个循环,它还需要类似于OpenMP 编译指示一类的指示来告诉它哪里有优化的空间:
std::vector﹤int﹥ v;
v.push_back(1);
v.push_back(5);
int total= 0;
#pragma ompfor
for (int ix = 0; ix ﹤ v.size();
++ix){
#pragma ompatomic
total+= v[ix];
}
第一个OpenMP指示提出了多线程运行for循环的要求,而第二个ompatomic指示则被
用来防止多线程同时向总数变量上写入。对于OpenMP,在MSDN库的参考文档中有关于所有
指示的详细介绍。
如果使用了声明式循环技巧,那么将并行方法应用在矢量求和上则更加干净简单。STL
for_each函数是一个理想的替代品,以上的例子则被改写如下:
classAdder{
private:
int _total;
public:
Adder(): _total(0) {}
voidoperator( ) ( int i )
{
_total+= i;
}
operatorint ( )
{
return_total;
}
};
voidVectorAdd()
{
std::vector﹤int﹥ v;
v.push_back(1);
v.push_back(5);
int total = std::for_each(v.begin(), v.end(),
Adder());
}
这里,具体的for循环被舍弃,求矢量和的代码变得干净了一些;但是由于需要使用一
系列运行符来定义一个类,这使得这个解决方案被大大的复杂化了。除非代码库中还有大量
类似的求和声明,否则一个开发者是不会仅仅为了STL for_each的那点好处而多花费功夫
去定义一个新类的。
仔细检查这个Adder类,可以很明显的看出其大部分内容都仅仅是用来满足将实例用作
函数对象的调用条件的。这个类中唯一起到计算作用的仅仅是那一行_total+=i.考虑到这
一点,C++0x提供了一个被大大简化了的、以lambda函数方式来实现的语法技巧。Lambda
函数移除了对这些搭架子代码的需求,并允许在另外的一个声明中定义一个谓词函数。由此,
VectorAdd函数可以被改写如下:
std::vector﹤int﹥ v;
v.push_back(1);
v.push_back(5);
int total= 0;
std::for_each(v.begin(),
v.end(),
[total](int x) {total+= x;}
);
Lambda函数的语法相当直截了当。方括号中的第一个lambda元素告诉编译器,本地变
量total通过引用被捕捉(这样的情况下最好用引用捕捉,因为你需要矢量和的结果在
for_each之后仍然有效),而lambda的第
文档评论(0)