计算机

编译优化

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

读完了,有什么想法?

阅读已保存的问答示例,并循着引用回到原文。

查看公开问答示例
— 本文完 — 返回文章列表