c++14 通过引用返回一个值以优化性能

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

我有一个最终将从内部 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++ 方法优化上述代码以变得更快?

也许通过引用返回?

最佳答案

正如其他人所建议的那样,返回应该如所写的那样。如果 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 或通过构造一个未命名的临时对象来提供它。但是复制的低效在于调用者。

附言

您认为这是性能瓶颈吗?

PPS

response 是类型名称和变量名称是一个有问题的选择。

关于c++14 通过引用返回一个值以优化性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57158385/

相关文章:

c++ - [错误] 数字常量之前的预期标识符。-setlocale

c++ - 在这种情况下如何使用 auto_ptr

javascript - 如何有效地完成这种效果?

templates - 无法从 FieldType* 推断出 T* 的模板参数(仅限 Visual C++)

c++ - 5 CPU的任务调度N进程

c++ - 无法从通用引用中捕获 lambda 中的引用?

c - 慢 OMP 与串行

Javascript变量效率较低

C++14 元组类型索引在我想成为 std::function 的 std::bind 推断类型上失败

c++ - 变量模板可以作为模板模板参数传递吗?