【问题标题】:Efficiency. Function return values versus output parameters效率。函数返回值与输出参数
【发布时间】:2010-10-13 08:57:59
【问题描述】:

函数返回值与“输出”参数,哪个更快?我想我最好用我目前正在做的事情来解释。

// specify identifier and return pointer.
SceneNode* createSceneNode(const String& desired_identifier);   // f1

// auto-gen identifier and return as string.
String createSceneNode(SceneNode*& out_ptr_to_creation); // f2

// auto-gen identifier and return pointer to node
SceneNode* createSceneNode(String& out_gen_identifier); // f3

// auto-gen identifier and return as string.
void createSceneNode(SceneNode*& out_ptr_to_creation, String& out_gen_identifier); // f4

虽然我更喜欢 f1 和 f3,因为它们返回 SceneNode*,但它们会导致模棱两可的调用。此外,通常只需要 SceneNode*。 f3 中的 String& 会带来一些不便和开销,所以我打算 f1 和 f2。

我的问题是,会不会有区别

f2(node); // return value not assigned.
          // will there be an optimisation NOT to copy string?
mystring = f2(node);

我的猜测是函数参数存储应该在一些访问速度非常快的区域,并且随时可用,因此输出参数工作得更快。但是,如果进行优化以防止在 f2 中复制字符串,则 f2 将优于 f4。

我知道在我的例子中,这可能是最小的,但我只是为了知识/兴趣而想知道。

另一个问题:我总是假设引用是 32 位数据,并且传递引用与指针一样快,是这样吗?

谢谢。 =)

【问题讨论】:

    标签: c++ function parameters return


    【解决方案1】:

    两者的区别

    mystring = f2(node)
    

    f2(node)
    

    理解很重要。在第一种情况下,大多数编译器将优化复制构造函数以按值返回,并简单地从函数中分配字符串,而无需额外的复制步骤。在第二个版本的情况下,大多数优化器将完全取消任何复制或赋值(根本没有赋值,并且可以优化返回的复制构造函数)。

    您关于 f2 与 f4 的陈述是准确的。由于收益优化,f2 很有可能优于 f4。 (当我找到一篇好文章时,我会添加一个链接。)

    哦,通过引用传递指针就可以了。

    【讨论】:

      【解决方案2】:

      我会使用 f1 和 f3 并简单地更改其中一个函数的名称(例如 f1 => createSceneNodeWithId)。这两个函数的语义不同,足以保证不同的名称。我会避免引用指针 (SceneNode *&),因为它可能有点令人困惑。

      返回String 可能会很慢,所以是的,您最好避免它并使用输出参数。我不认为复制可以被优化掉,除非(a)函数是内联的或者(b)你的编译器执行了一个很好的整个程序分析。英特尔 C++ 编译器会这样做,但我不知道它是否能捕捉到这种情况。

      回答您的附带问题:引用实际上是具有不同语法的指针。在 32 位平台上为 32 位宽,在 64 位平台上为 64 位。

      【讨论】:

        猜你喜欢
        • 2012-08-16
        • 2012-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-11
        • 2020-11-27
        • 1970-01-01
        相关资源
        最近更新 更多