gpt4 book ai didi

c++ - 有效地返回未修改的参数

转载 作者:搜寻专家 更新时间:2023-10-31 01:27:09 25 4
gpt4 key购买 nike

我有一个函数应该修改一个对象的实例或返回它未修改,它可以简化为以下代码:

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 参数,那么将需要一些拷贝,这将比就地修改 + 通过引用返回更昂贵。

关于c++ - 有效地返回未修改的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53907753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com