C++ 中表达式模板的标准音调是它们通过删除不必要的临时对象来提高效率。为什么 C++ 编译器不能删除这些不必要的临时对象?
这是一个我想我已经知道答案的问题,但我想确认一下,因为我在网上找不到低级别的答案。
表达式模板本质上允许/强制进行极端程度的内联。但是,即使使用内联,编译器也无法优化对的调用operator new
,operator delete
因为它们将这些调用视为不透明的,因为这些调用可以在其他翻译单元中被覆盖。表达式模板完全删除了对中间对象的调用。
这些多余的调用operator new
和operator delete
可以在一个简单的例子中看到,我们只复制:
#include <array>
#include <vector>
std::vector<int> foo(std::vector<int> x)
{
std::vector<int> y{x};
std::vector<int> z{y};
return z;
}
std::array<int, 3> bar(std::array<int, 3> x)
{
std::array<int, 3> y{x};
std::array<int, 3> z{y};
return z;
}
在生成的代码中,我们看到foo()
编译为一个相对冗长的函数,其中两次调用operator new
和一次调用operator delete
whilebar()
编译为仅传输寄存器并且不进行任何不必要的复制。
这个分析正确吗?
任何 C++ 编译器都可以合法地删除其中的副本foo()
吗?