小编Ben*_*n C的帖子

如果没有定义析构函数,为什么返回值优化不会发生?

我希望从这个测试程序中看到命名返回值优化 (NRVO) 的复制省略,但它的输出是“地址不匹配!” 所以 NRVO 没有发生。为什么是这样?

// test.cpp
// Compile using:
//      g++ -Wall -std=c++17 -o test test.cpp
#include <string>
#include <iostream>

void *addr = NULL;

class A
{
public:
    int i;
    int j;

#if 0
    ~A() {}
#endif
};

A fn()
{
    A fn_a;

    addr = &fn_a;

    return fn_a;
}

int main()
{
    A a = fn();

    if (addr == &a)
        std::cout << "Addresses match!\n";
    else
        std::cout << "Addresses do not match!\n";
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 如果通过启用#if上述定义析构函数,则 …

c++ class copy-elision rvo nrvo

5
推荐指数
1
解决办法
223
查看次数

标签 统计

c++ ×1

class ×1

copy-elision ×1

nrvo ×1

rvo ×1