也就是说,当利用C 11 typename时,通常会在设计良好的C 03代码中获得多少性能改进
编辑:
想象一个替代的宇宙,在这个宇宙中,不是右值引用C 11,而是用一个关键字“返回”来扩展C 03,这个关键字标记了一个将被函数返回的局部变量。如果一个局部变量被标记为“返回”,它就被放置在堆栈的返回值通常所在的部分。想象一下,你可以像这样使用这个关键字:
SomeClass foo()
{
returning SomeClass bar; // Created where return value usually resides.
// do something with bar
return bar; // No copy constructor is involved here.
}
我认为这种机制将能够创建make_unique和右值引用一样,并且会造成更少的混乱和潜在的陷阱。三规则将仍然是三规则,而不是成为五规则;不会混淆是否
我错过了什么?
右值引用的价值主要不在于性能。相反,它在于表现力。没有右值引用,您无法以有用的方式在类型系统中编码所有权。由于右值引用允许的所有权转移,我们现在可以编写完全子表达式正确的代码,没有非本地依赖关系。
例如,C 11之前:
int * p = new int[N]; // may be a bug, who knows?
// ... keep paying attention...
delete p; // ah, no bug... or is it?
带右值:
auto p = std::make_unique<int[]>(N); // fine
请注意,现代示例的任何子表达式本身都不是资源bug的根本原因。同样的方法可以应用于无数资源/句柄对:内存/指针、文件/句柄、互斥锁/锁、任务/延续等。
(如果您将资源获取和释放视为两个相反的极点,那么现代C应该像磁铁一样书写:两者始终作为一个实体的一部分在一起。)
允许类型系统完全保证正确性的局部性是语言的显着改进。