c++ - 有效地返回未修改的参数
问题描述
我有一个函数,它要么修改对象的实例,要么不加修改地返回它,这可以简化为以下代码:
struct MyObject
{
bool ShouldNotChange;
int SomeData[10];
};
void ModifyObject_inplace(MyObject & object)
{
if (object.ShouldNotChange) return;
// Modify object here
object.SomeData[1] = 1;
}
出于多种原因,我想将此代码转换为更实用的样式:
MyObject ModifyObject(MyObject object)
{
if (object.ShouldNotChange)
return object;
object.SomeData[1] = 1;
return object;
}
问题是这个函数是性能关键的,当以这种方式修改时它会变得更慢。我尝试了几种不同的变体。
MyObject ModifyObject_constref(const MyObject & object)
{
if (object.ShouldNotChange)
return object;
auto result = object;
result.SomeData[1] = 1;
return result;
}
std::shared_ptr<MyObject> ModifyObject_ptr(const std::shared_ptr<MyObject> & object_ptr)
{
if (object_ptr->ShouldNotChange)
return object_ptr;
object_ptr->SomeData[1] = 1;
return object_ptr;
}
MyObject && ModifyObject_rvalue(MyObject object)
{
if (object.ShouldNotChange)
return std::move(object);
MyObject newRoute = object;
newRoute.SomeData[1] = 1;
return std::move(newRoute);
}
但只有ModifyObject_inplace
给出最快的代码(通过反汇编判断)。实际上只是ModifyObject_inplace
被编译器翻译成一个函数,而无需在汇编代码中进行一次跳转。我正在使用 VC++ 2017。
有什么方法可以在不影响性能的情况下以功能风格实现它?
解决方案
你可以有:
MyObject& ModifyObject(MyObject& object)
{
if (object.ShouldNotChange) return object;
// Modify object here
object.SomeData[1] = 1;
return object;
}
如果您需要 const 参数,则需要一些副本,这将比原地修改 + 引用返回更昂贵。
推荐阅读
- laravel - 需要从当前调用另一个控制器的功能吗?这是一个正确的方法吗?
- javascript - 我不能返回一个对象,除非花括号放在 return 语句旁边
- android - 在使用 RxJava 的绑定服务中与 UI 通信
- sql - 在sql中查询从xml中提取字符串
- c# - 为流数据类型准备 JSON 数据请求
- aws-amplify - 如何在放大初始化期间配置 AWS 配置文件的使用?
- google-natural-language - Google 自然语言 API - 错误:打开的文件过多
- wso2 - 使用 XACML 启用基于角色的访问控制 - 评估策略时出错
- python - imshow 和 pcolormesh 显示具有相同输入的两个不同输出
- android - StartActivityForResult 不适用于 Kotlin 扩展函数?