是否应该通过const引用传递小的简单结构?

时间:2010-07-22 22:28:04

标签: c++ function pass-by-reference user-defined-types

我一直被告知非原始类型应该通过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版本?

是这样的吗?最简单的对象是否最符合价值?该线应该在哪里绘制?

6 个答案:

答案 0 :(得分:8)

是的,应该通过值传递简单对象。必须根据架构绘制线。如有疑问,请参阅。

答案 1 :(得分:1)

通过const引用传递可以避免构造新对象。如果你的构造函数是非平凡的,例如,它分配内存,那么通过const引用而不是通过值传递 会更好。

在C#世界中,您可以通过选择是创建类还是结构来做出此决定。类使用引用语义,而结构使用值语义。我读过的所有内容都说你应该选择将所有内容都设为一个类,除非它非常小,即大约16个字节。如果你正在寻找在C ++中传递值与const引用的截止时间,那么16个字节似乎是一个合理的阈值。

答案 2 :(得分:1)

就策略而言,我通过const引用传递任何不是基本C数据类型的对象。这种方式更容易记住。

答案 3 :(得分:1)

可以在http://www.ddj.com/184403855找到对传递参数输入的较旧但清晰的分析。当然c ++ 0x在移动语义方面避免了很多这样的问题,但是本文提供了很多理由来说明为什么需要移动语义。

答案 4 :(得分:1)

答案 5 :(得分:0)

  

我的想法是,通过引用传递Vector2,它实际上比传递值更昂贵,因为编译器现在使用指针和解除引用来访问const Vector2& pos版本

如果您传递size_of(object) < size_of(pointer_to_object)的对象,那将是真的。例如,char const&可能比char