C++ 内联函数和复制构造函数
这两个内联函数之间有什么区别C++ 内联函数和复制构造函数,c++,c++11,C++,C++11,这两个内联函数之间有什么区别 inline void setValue(ClassName& value); vs inline void setValue(ClassName value); 基本上,编译器将如何处理这两种情况g++/MSComp 类似的情况,但具有基本体: inline void setValue(const float value); inline void setValue(float& value); inline void setValue(flo
inline void setValue(ClassName& value);
vs
inline void setValue(ClassName value);
基本上,编译器将如何处理这两种情况g++/MSComp
类似的情况,但具有基本体:
inline void setValue(const float value);
inline void setValue(float& value);
inline void setValue(float value);
第二个内联不会更改原始对象的值,因为它将首先被复制,而复制对象的值将被更改
对于基元类型,只有引用一(第二个)可以更改
值
基元。第二个内联不会更改原始对象的值,因为它将首先被复制,而复制对象的值将被更改
对于基元类型,只有引用1(第2个)可以更改
值基元。内联
主要是一个链接器指令,因此在这里没有任何区别w.r.t.参数传递。安全地忽略这一点
void setValue(ClassName& value);
通过引用获取传入对象,从而编辑实际传入对象,而
void setValue(ClassName value);
按值获取它,因此使用原始对象的副本。对此局部变量所做的更改对于调用方传入的参数来说无关紧要
对于内置(原语)类型,按引用和按值传递的含义也保持不变。这两个变量<代码>无效设置值(浮动值)代码>和无效设置值(常量浮点值)
对调用方没有什么意义,因为您无论如何都在复制值,对于调用方来说,const
并不重要,尽管在函数的实现站点上,它不允许对复制的本地值进行意外编辑,因为它是函数中的常量。
主要是一个链接器指令,因此在这里没有任何区别。参数传递。安全地忽略这一点
void setValue(ClassName& value);
通过引用获取传入对象,从而编辑实际传入对象,而
void setValue(ClassName value);
按值获取它,因此使用原始对象的副本。对此局部变量所做的更改对于调用方传入的参数来说无关紧要
对于内置(原语)类型,按引用和按值传递的含义也保持不变。这两个变量<代码>无效设置值(浮动值)代码>和无效设置值(常量浮点值)代码>对调用者来说没有什么意义,因为你无论如何都在复制值,对于调用者来说,常量
并不重要,尽管在函数的实现站点上,它不允许对复制的本地值
进行意外编辑,因为它位于函数中。您的评论:
让我们说速度是最重要的,我不想复制构造函数在任何时候被调用。我会选择哪种方法
当然是那个不带拷贝的!使用引用,即使它是常量并且您不想更改参数对象。有些情况下,现代编译器会避免复制。谈到移动构造函数/赋值运算符实现的实现,您可能会感兴趣。您的评论:
让我们说速度是最重要的,我不想复制构造函数在任何时候被调用。我会选择哪种方法
当然是那个不带拷贝的!使用引用,即使它是常量并且您不想更改参数对象。有些情况下,现代编译器会避免复制。谈到移动构造函数/赋值运算符实现的实现,您可能会感兴趣。@DieterLücking我曾经想过,但通常这些编译器的事情会根据代码的复杂性而变化,所以我想我会在堆栈上问你们。您的问题与内联有什么特别的关系??对于ClassName
的使用,非inline
定义有什么不同吗?请详细说明,就目前而言,这个问题对我来说毫无意义…@DieterLücking让我们说速度是最重要的,我不想复制构造函数来随时调用。我会选择哪种方法?事实上,我希望编译器使用我传入的确切变量作为对象,它将作为函数的参数,在本例中,它将被放入调用者中。@πάνταῥεῖ 我只是想确认一下。非常感谢。我必须在多次反对票中幸存下来:(@mk1我应该做一个答案,你会接受吗?)…@DieterLücking我在想这个问题,但通常这些编译器的事情会根据代码的复杂程度而变化,所以我想我会问你们堆栈上的人。你们的问题和内联
有什么特别的关系??对于ClassName
的使用,非inline
定义有什么不同吗?请详细说明,就目前而言,这个问题对我来说毫无意义…@DieterLücking让我们说速度是最重要的,我不想复制构造函数来随时调用。我会选择哪种方法?事实上,我希望编译器使用我传入的确切变量作为对象,它将作为函数的参数,在本例中,它将被放入调用者中。@πάνταῥεῖ 我只是想确认一下。非常感谢。必须通过多次否决票才能获得该tho:(@mk1我应该做出这样的回答吗,你会接受吗?;)…“第二次内联不会改变值”是的,会的!无论是否内联…我指的是原始对象,因为它会被复制。这个问题和这个问题不匹配,所以我猜测他想理解通过引用传递还是通过值传递。@FilipeGonçalves是的,但这与本案例中的结果或问题无关!答案已经增强,声明原始值没有更改。“第二个内联不会更改值”是的,它会!无论是否内联…我指的是原始对象,因为它会被复制。问题和问题不匹配,