【发布时间】:2011-03-19 20:17:39
【问题描述】:
我一直被教导非原始类型应该通过 const 引用而不是在可能的情况下通过值传递,即:
void foo(std::string str);//bad
void foo(const std::string &str);//good
但我今天在想,也许实际上一些简单的用户定义类型实际上可能更好地按值传递,例如:
class Vector2
{
public:
float x, y;
...constructors, operators overloads, utility methods, etc...
};
void foo(Vector2 pos);
void foo(const Vector2 &pos);//is this really better than by value?
void foo(float x, float y);//after all isn't by value effectively doing this?
我的想法是,通过引用传递 Vector2,实际上比通过值传递更昂贵,因为编译器现在使用指针和取消引用来访问 const Vector2 &pos 版本?
是这样吗?简单的对象最好按值传递吗?应该在哪里画线?
【问题讨论】:
-
请注意,如果您的类类型有用户声明的构造函数,则它不是 POD。
-
一般经验法则:通过 const-reference 传递,除非
sizeof(T) <= sizeof(void*)或T是原始的。 -
@GMan,你打败了我(和 +1)。虽然,我会概括为它可能小于或等于处理器的字长。而且,应该检查处理器规格以找出最佳尺寸。如果我没记错的话,在某些情况下,无论大小如何,编译器都可能将 const ref 优化为按值传递。考虑到新的移动语义,我想这在 C++0x 中尤其如此。
-
@James 我想不符合当前的 C++03 标准,尽管从外观上看 C++0x 会认为这是一个 POD。
-
我认为在极少数情况下您的对象会小于处理器的字长和/或 sizeof(void*) ... @Fire 你真的需要画一个非常薄的行;-)
标签: c++ function pass-by-reference user-defined-types