WEB开发网
开发学院软件开发VC VC10中的C++0x特性 Part 2 (1):右值引用 阅读

VC10中的C++0x特性 Part 2 (1):右值引用

 2009-06-10 20:07:44 来源:WEB开发网   
核心提示: 最最没有必要的拷贝是拷贝那些立马会被销毁的对象,你有过复印一份文件,VC10中的C++0x特性 Part 2 (1):右值引用(6),并马上把原件扔掉的经历么(假定原件和复件是相同的)?那简直是浪费,你应该持有原件而不必费劲去复印,因为每一个串接操作都会拷贝所有已经串接好的字符,所以那个复

最最没有必要的拷贝是拷贝那些立马会被销毁的对象。你有过复印一份文件,并马上把原件扔掉的经历么(假定原件和复件是相同的)?那简直是浪费,你应该持有原件而不必费劲去复印。下面是被我称作“杀手级的示例”,来自标准委员会的例子(见提案 N1377),假设你有一大堆 string 像这样的:

string s0("my mother told me that");
string s1("cute");
string s2("fluffy");
string s3("kittens");
string s4("are an essential part of a healthy diet");

然后你想像这样把它们串接起来:

string dest = s0 + " " + s1 + " " + s2 + " " + s3 + " " + s4;

这样做的效率如何?(我们不用为这个特殊的例子而担忧,它的执行只要几微秒;我们担忧它的一般化情况,在语言层面上的情况)。

每次调用操作符 +() 就会返回一个临时 string。上面调用了 8 次操作符 +(),因而产生了 8 个临时 string。 每一个临时 string,在构造过程中分配动态内存,再拷贝所有已连接的字符,最后在析构过程中释放分配的动态内存。(你听说过短串优化技术么,为了避免动态内存的分配与释放,VC是这么干的,在这个被我精心挑选的有着合适长度的 s0 面前短串优化技术也无能为力,即使执行了这样的优化,也无法避免拷贝操作。如果你还听说过写时拷贝优化(Copy - On - Write),忘了它吧,在这里也不适用,并且在多线程环境下这种优化会恶化问题,因此标准库实现根本就不再做这个优化了)。

事实上,因为每一个串接操作都会拷贝所有已经串接好的字符,所以那个复杂度是字符串长度的平方了。哎呀!这太浪费了!这点确实让 C++ 尴尬。事情怎么会搞成这样呢?有没有改善的办法?

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:VC 特性 Part

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接