编译优化
NRVO
NRVO(Named Return Value Optimization,命名返回值优化)是 C++ 许多主流编译器会引入的一种技术。
NRVO 可以节省一次内存移动。
假设有以下的代码:
std::string f(char start, int n) {
std::string s;
for (int i = 0; i < n; i++) {
s.push_back(start + i);
}
return s;
}
int main() {
std::string alphabet = f('a', 26);
}
不进行 NRVO 时,程序会先创建好一个 s,然后通过移动构造函数把 s 传给 alphabet。这样不需要重新申请堆内存,但仍然涉及了构造函数和析构函数的调用。
而进行 NRVO 时,编译器看到这段代码,会直接在 alphabet 上构造一个字符串,连移动构造都省去。编译器会将代码优化成类似下面的结构:
void f(std::string* return_addr, char start, int n) {
new (return_addr) std::string();
for (int i = 0; i < n; ++i) {
return_addr->push_back(start + i);
}
}
int main() {
std::string alphabet; // 概念上的存储空间
f(&alphabet, 'a', 26);
}
BEYOND THE ARTICLE
读完了,有什么想法?
阅读已保存的问答示例,并循着引用回到原文。
— 本文完 — 返回文章列表