C++ 效率。函数返回值与输出参数

C++ 效率。函数返回值与输出参数,c++,function,parameters,return,C++,Function,Parameters,Return,函数返回值与“输出”参数相比,哪一个更快?我想我最好用我目前的工作来解释 // 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_c

函数返回值与“输出”参数相比,哪一个更快?我想我最好用我目前的工作来解释

// 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*,但它们会导致模糊调用。此外,通常只需要Sceneode*。f3中的字符串&将带来一些不便和开销,因此我计划使用f1和f2

我的问题是,两者之间会有区别吗

f2(node); // return value not assigned.
          // will there be an optimisation NOT to copy string?
mystring = f2(node);
mystring = f2(node)
我的猜测是,函数参数存储应该位于一些非常快速的访问区域,并且将随时可用,以便输出参数更快地工作。然而,如果进行优化以防止在f2中复制字符串,则f2将优于f4

我知道在我的例子中,这可能是最小的,但我只是想知道的知识/兴趣的缘故

另一个附带问题:我总是假设引用是32位数据,传递引用的速度和指针一样快,是这样吗


谢谢

我将使用f1和f3,只需更改其中一个函数的名称(例如f1=>
createSceneNodeWithId
)。这两个函数的语义完全不同,因此可以使用不同的名称。我会避免引用指针(
sceneode*&
),因为它可能会有点混乱

返回
字符串
可能很慢,因此是的,您最好避免使用它并使用输出参数。我不认为复制可以优化掉,除非(a)函数是内联的,或者(b)您的编译器执行良好的整个程序分析。英特尔C++编译器做了这件事,但我不知道它是否能赶上这个例子。 回答您的附带问题:引用实际上是一个具有不同语法的指针。它在32位平台上的宽度为32位,在64位平台上的宽度为64位。

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

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

你关于f2和f4的陈述是准确的。由于回报优化,f2有很好的机会超越f4。(当我找到一篇好文章时,我会添加一个链接。)

哦,通过引用传递指针也很好