首页 > 解决方案 > 有效地返回未修改的参数

问题描述

我有一个函数,它要么修改对象的实例,要么不加修改地返回它,这可以简化为以下代码:

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。

有什么方法可以在不影响性能的情况下以功能风格实现它?

标签: c++c++17

解决方案


你可以有:

MyObject& ModifyObject(MyObject& object)
{
    if (object.ShouldNotChange) return object;

    // Modify object here
    object.SomeData[1] = 1;
    return object;
}

如果您需要 const 参数,则需要一些副本,这将比原地修改 + 引用返回更昂贵。


推荐阅读