C++ 使用对象的指针和引用作为函数参数是否更轻松?

C++ 使用对象的指针和引用作为函数参数是否更轻松?,c++,function,C++,Function,我想知道: //Let's say T is a big class with + operand implemented. T add(T* one, T* two) { return *one + *two; } 以及: 比这个轻: T add (T one, T two) { return one +two; } 如果没有,那么如果没有任何东西会改变对象的数据,为什么会有人使用指向对象的指针或引用而不是对象本身作为函数的参数呢?不,您的上一个版本是“更轻” 但这是因

我想知道:

//Let's say T is a big class with + operand implemented.
T add(T* one, T* two)
{
     return *one + *two;
}
以及:

比这个轻:

T add (T one, T two)
{
     return one +two;
}
如果没有,那么如果没有任何东西会改变对象的数据,为什么会有人使用指向对象的指针或引用而不是对象本身作为函数的参数呢?

不,您的上一个版本是“更轻”

但这是因为
int
参数可以很容易地在堆栈上传递。对于较大的数据类型、类等,传递指针更有效

此外,如果需要更改函数中某个参数的值,则需要指向该参数的指针(引用是其一种类型)才能对其进行修改。

否,您的上一个版本是“打火机”

但这是因为
int
参数可以很容易地在堆栈上传递。对于较大的数据类型、类等,传递指针更有效

此外,如果需要更改函数中某个参数的值,则需要指向该参数的指针(引用是其一种类型)才能对其进行修改。

如果“更轻”的意思是“更高效”,则答案(对于ints)是否--如果要传递的对象非常大(例如sizeof(object Type)明显大于指针的典型大小4或8个字节),则按指针或引用传递参数的唯一时间可能比按值传递更有效,或者,如果对象的类有一个副本构造函数,其实现在计算上非常昂贵。请注意,当通过指针或引用进行传递时,CPU在访问数据时必须取消对指针/引用的引用,这并不是完全免费的

如果不是,那么为什么有人会使用指向对象的指针或引用呢 而不是对象本身作为函数的参数(如果没有) 将更改对象的数据吗

可能是他们想要向函数传递对象的特定实例,而不是(仅)对象的内容。例如,如果传入指向特定全局对象的指针,则编写的函数的行为可能与传入任何其他指针时的行为不同(尽管这种做法不好)

通过指针传递还为调用者提供了将NULL作为参数传递的选项,如果您希望调用者能够指定“此参数未提供任何值”,则此选项非常有用。

如果“更轻”表示“更高效”,则答案(对于ints)是否--如果要传递的对象非常大(例如sizeof(object Type)明显大于指针的典型大小4或8个字节),则按指针或引用传递参数的唯一时间可能比按值传递更有效,或者,如果对象的类有一个副本构造函数,其实现在计算上非常昂贵。请注意,当通过指针或引用进行传递时,CPU在访问数据时必须取消对指针/引用的引用,这并不是完全免费的

如果不是,那么为什么有人会使用指向对象的指针或引用呢 而不是对象本身作为函数的参数(如果没有) 将更改对象的数据吗

可能是他们想要向函数传递对象的特定实例,而不是(仅)对象的内容。例如,如果传入指向特定全局对象的指针,则编写的函数的行为可能与传入任何其他指针时的行为不同(尽管这种做法不好)


通过指针传递还为调用者提供了将NULL作为参数传递的选项,如果您希望调用者能够指定“没有为此参数提供任何值”,则此选项非常有用。

对于灯光类型,即适合于寄存器(如
int
)的灯光类型,这没有什么区别,因为它们就像指向它们的指针一样容易复制。实际上,额外的间接操作可能会损害性能,因此,如果不需要,您应该避免引入它。
但是,所使用的类型复制起来可能会很昂贵。每日示例是
std::string
。引用可以避免复制,并且在函数需要“重”对象的地方更受欢迎

在函数模板中,在获取各种对象类型时,通常应使用引用,除非您确定只涉及“轻”类型,如迭代器或标量。
不过,这条规则还有一些不太明显的例外。考虑:


指针本身不应用于间接函数参数。它们在C语言中使用,在C语言中不存在引用。

对于轻型类型,即适合于寄存器(如
int
)的类型,这没有什么区别,因为它们与指向它们的指针一样容易复制。实际上,额外的间接操作可能会损害性能,因此,如果不需要,您应该避免引入它。
但是,所使用的类型复制起来可能会很昂贵。每日示例是
std::string
。引用可以避免复制,并且在函数需要“重”对象的地方更受欢迎

在函数模板中,在获取各种对象类型时,通常应使用引用,除非您确定只涉及“轻”类型,如迭代器或标量。
不过,这条规则还有一些不太明显的例外。考虑:


指针本身不应用于间接函数参数。它们在C语言中使用,这里不存在引用。

答案通常是:视情况而定。

如果你想知道拷贝或通过引用是否便宜,或者正确的事情,考虑这些:

  • 与指向该对象的指针相比,复制该对象的成本有多高。
    无论如何,根据参数的传递方式,有时可以忽略副本

    对于
    int
    ,指针/引用最多
    T add (T one, T two)
    {
         return one +two;
    }
    
    template< class InputIt, class T >
    T accumulate( InputIt first, InputIt last, T init );
    
    template<class InputIt, class T>
    T accumulate(InputIt first, InputIt last, T init)
    {
        for (; first != last; ++first) {
            init = init + *first; // Here
        }
        return init;
    }