函数返回值与“输出”参数,哪一个更快?我想我最好用我目前正在研究的东西来解释。
// 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 *,它们会导致ambiguos调用。此外,通常只需要SceneNode *。弦乐与弦乐在f3中会出现一些不便和开销,所以我正在计划f1和f2。
我的问题是,
之间会有区别吗?f2(node); // return value not assigned.
// will there be an optimisation NOT to copy string?
mystring = f2(node);
我的猜测是功能参数存储应该在一些非常快速的访问区域中并且随时可用,因此输出参数工作得更快。但是,如果进行优化以防止f2中的复制字符串,那么f2将优于f4。
我知道在我的例子中,这可能是最小的,但我只是想了解知识/兴趣。
另一个问题:我总是假设引用是32位数据,传递引用和指针一样快,是这样吗?
感谢。 =)
答案 0 :(得分:2)
之间的区别
mystring = f2(node)
和
f2(node)
很重要。在第一种情况下,大多数编译器将优化远离复制构造函数以按值返回,并简单地从函数中分配字符串而无需额外的复制步骤。在第二个版本的情况下,大多数优化器将完全取消任何副本或赋值(根本没有赋值,并且可以优化返回的复制构造函数)。
关于f2与f4的说法是准确的。由于返回优化,f2很有可能超越f4。 (当我找到它时,我会添加一篇很好的文章链接。)
哦,通过引用传递指针就好了。
答案 1 :(得分:1)
我会使用f1和f3,只需更改其中一个函数的名称(例如f1 => createSceneNodeWithId
)。两个函数的语义都不同,足以保证不同的名称。我会避免引用指针(SceneNode *&
),因为它可能有点令人困惑。
返回String
可能会很慢,所以是的,你最好避免它并使用输出参数。除非(a)函数内联或(b)编译器执行良好的整个程序分析,否则我认为不能优化复制。英特尔C ++编译器可以做到这一点,但我不知道是否会遇到这种情况。
回答你的旁边问题:引用实际上是一个具有不同语法的指针。它在32位平台上为32位宽,在64位平台上为64位。