c++14 return 通过引用优化性能的值
c++14 return a value by reference to optimize performance
我有一个最终会从内部 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++方法优化以上代码,使其变得更快?
也许通过引用返回?
正如其他人所建议的那样,return 应该与写的一样。如果 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::move
ing 或构造一个未命名的临时对象来提供它。但是这样复制的低效就在调用者身上了。
PS
您认为这是性能瓶颈吗?
PPS
response
是类型名称和变量名称是一个有问题的选择。
我有一个最终会从内部 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++方法优化以上代码,使其变得更快?
也许通过引用返回?
正如其他人所建议的那样,return 应该与写的一样。如果 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::move
ing 或构造一个未命名的临时对象来提供它。但是这样复制的低效就在调用者身上了。
PS
您认为这是性能瓶颈吗?
PPS
response
是类型名称和变量名称是一个有问题的选择。