【问题标题】:c++14 return a value by reference to optimize performancec++14通过引用返回值优化性能
【发布时间】:2019-07-23 07:01:00
【问题描述】:

我有一个最终会从内部 api 调用中获取值的方法

auto val = api->post(req);  //step 1

// the post returns a class of "type json"

json api::post(const request& request) { //step 2

   // do some job
   json j = << some json data>>
   return j;

}

现在有第三步,准备将 http 响应返回给外部调用者。

response server::http_response(const json &final_jsond) {

    auto response = response{final_json}; //that makes the json a string for the http payload
    response.set_header("Content-Type", "application/json");

    return response;
}

现在,这段代码可以工作了,但是我想知道我是否遗漏了一些现代 C++ 原则,以避免将 json 对象从一个调用复制到另一个调用

上面的代码能不能用现代c++的方法优化,变得更快?

可能通过引用返回?

【问题讨论】:

  • 三个主要编译器都擅长 RVO(返回值优化),例如复制省略。您也可以使用“移动”构造函数和std::move 来避免复制。
  • @nivpeled 对局部变量的引用?那是个坏主意。
  • @nivpeled 因为那会产生问题。
  • 顺便说一句,在很久以前 modern C++ 出现之前,通过引用返回就已经存在了。它与现代的东西无关。
  • 除非 sizeof(...) 很大,否则只需确保您有一个移动构造函数并按值返回。你不需要 std::move here

标签: c++ performance c++14 copy-elision return-value-optimization


【解决方案1】:

正如其他人所建议的那样,退货应该是书面的。如果 server::http_response 使用它的参数是合理的,并且如果 response 实际上持有 json 或其中的数据,那么你可以这样做

response server::http_response(json&& final_json) {
    auto response = response{std::move(final_json)}; //that makes the json a string for the http payload
    response.set_header("Content-Type", "application/json");

    return response; // You don't need std::move here.
}

当复制成本很高时,我有时会使用这种模式。它强制调用者执行myResponse = myServer.http_response(std::move(final_json));,这对性能来说是可取的。如果调用者想要保留他们的json 对象,那么他们可以改为调用myServer.http_response(json(final_json));。换句话说,如果http_response 采用右值引用,那么调用者可以通过std::moveing 或通过构造一个未命名的临时值来提供它。但是复制的效率低下是在调用者身上。

PS

您是否认为这是性能瓶颈?

PPS

response 用作类型名称和变量名称是一个值得商榷的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多