【问题标题】:C++ Immutable custom class pass by reference or valueC++ 不可变自定义类通过引用或值传递
【发布时间】:2017-06-21 20:25:46
【问题描述】:

我制作了一个自定义类,其中涉及大量数字和字符串计算。通过只提供访问器而不提供修改器,我使我的类不可变。一旦构造了对象,就不会更改它的单个属性。

我的问题是,目前我的所有函数都是按值传递的。如果您有一个不可变对象,是否还需要通过引用传递?由于需要不断创建副本,因此按值传递是否会浪费内存?

例如:

class MyInteger
{
    private:
        const int val;

    public:
        MyInteger(const int a) : val(a) { };    
        int getValue() const { return val; }
        MyInteger add(const MyInteger other)
        {
            return MyInteger(val + other.getValue());   
        }
}

【问题讨论】:

  • 通过引用传递 const。我认为对于内置类型并不重要。
  • @RawN 我不明白你的意思?
  • getValue 必须是 const
  • @ChristianHackl 是的,对不起,我忘了在这个小演示 sn-p 中添加它。我刚刚添加了用于视觉辅助的代码,我上面的问题与该实现没有任何关系。
  • @Hatefiend:对不可变类的非常量引用没有意义。 const 引用确实有意义。关于复制与 const 引用的性能,这通常无关紧要,因为您的计算机太快并且您的编译器太聪明了。除非分析另有说明,否则一个好的经验法则是通过 const& 传递类类型的不可变“大”对象,并按值传递原始对象以及迭代器和仿函数。考虑到这一点,几乎不会出错,您只需在非常具体的情况下重新考虑规则。

标签: c++ pass-by-reference immutability pass-by-value pass-by-const-reference


【解决方案1】:

按值传递需要复制。如果你的类很大并且复制成本很高,你可以通过引用来避免这种复制。

由于它是不可变的,您可以通过引用到常量来传递它。

class MyInteger
{
    private:
        const int val;

    public:
        MyInteger(const int a) : val(a) { };    
        int getValue() const { return val; }

        MyInteger add(const MyInteger& other) const // Note this is passed by reference to const now
        //                           ~
        {
            return MyInteger(val + other.getValue());   
        }
}

【讨论】:

  • / /Note that this is pass by value. 你应该删除这条评论。
  • 我在思考我的问题时忘记添加 const。除了“添加”不应修改 other 变量的小优化之外,我不太确定 const 与我的问题有什么关系。但是,我仍然没有真正掌握何时使用按值传递。
  • @Hatefiend 看看这里:link
  • 有趣。该线程中有很多相互矛盾的答案。我的班级有三个成员:unsigned char*boolsize_t。好像不大吧?按值传递可能没问题?
  • @Hatefiend 根据经验,您可以考虑传递 uint8_t 而不是使用 const 引用的值。那可能会占用更少的堆栈空间。不过,我不喜欢这种微优化。
猜你喜欢
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 2014-05-05
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多