C++ 在函数中使用引用或返回

C++ 在函数中使用引用或返回,c++,C++,我想改变一个向量。我不知道是更改每个引用的向量更好,还是返回一个副本更好。avr gcc是否优化了额外的复制操作(对于具有返回的版本是必需的)?更好的做法是什么 inline void wrap180_Vec3f(Vector3f &vec) { vec.x = vec.x < -180.f ? (vec.x + 360.f) : (vec.x > 180.f ? (vec.x - 360.f) : vec.x); vec.y = vec.y < -180.f

我想改变一个向量。我不知道是更改每个引用的向量更好,还是返回一个副本更好。avr gcc是否优化了额外的复制操作(对于具有返回的版本是必需的)?更好的做法是什么

inline void wrap180_Vec3f(Vector3f &vec) {
  vec.x = vec.x < -180.f ? (vec.x + 360.f) : (vec.x > 180.f ? (vec.x - 360.f) : vec.x);
  vec.y = vec.y < -180.f ? (vec.y + 360.f) : (vec.y > 180.f ? (vec.y - 360.f) : vec.y);
  vec.z = vec.z < -180.f ? (vec.z + 360.f) : (vec.z > 180.f ? (vec.z - 360.f) : vec.z);
}
inline void wrap180_Vec3f(Vector3f&vec){
向量x=向量x<180.f?(向量x+360.f):(向量x>180.f?(向量x-360.f):向量x);
向量y=向量y<-180.f?(向量y+360.f):(向量y>180.f?(向量y-360.f):向量y);
向量z=向量z<180.f?(向量z+360.f):(向量z>180.f?(向量z-360.f):向量z);
}

inline Vector3f wrap180\u Vec3f(Vector3f-vec){
向量x=向量x<180.f?(向量x+360.f):(向量x>180.f?(向量x-360.f):向量x);
向量y=向量y<-180.f?(向量y+360.f):(向量y>180.f?(向量y-360.f):向量y);
向量z=向量z<180.f?(向量z+360.f):(向量z>180.f?(向量z-360.f):向量z);
返回向量;
}

我会通过引用传递并使用返回。它使编译器有机会进行一些优化,例如返回值优化或移动对象。它也更可读,无需检查函数签名

比如说

Vector3f v= wrap180_Vec3f( vec );
//它的可读性比

wrap180_Vec3f(v); 

但是,如果您的目的是修改现有对象,请使用引用。

很明显,与按值传递向量并按值返回向量相比,按引用传递向量是最快的方法。此外,在最后一种情况下,您还需要通过返回的向量来分配原始向量。这包括对向量本身及其元素的构造函数和复制/移动赋值运算符的大量调用


对于此类复合对象,最佳做法是,如果需要更改它们,则通过引用传递它们;如果不打算更改它们,则通过常量引用传递它们。

在AVR上,除了通过引用传递之外,做任何事情都是疯狂的

除非您知道编译器内联是如何完成的,否则可能会耗尽CPU周期,比如没有内联,或者编译器实现不好,否则堆栈/堆将被更多地使用

此外,我不确定您的代码是否有任何意义您的意思是:

inline void wrap180_Vec3f(Vector3f *vec) {
  vec->x = vec->x < -180.f ? (vec->x + 360.f) : (vec->x > 180.f ? (vec->x - 360.f) : vec->x);
  vec->y = vec->y < -180.f ? (vec->y + 360.f) : (vec->y > 180.f ? (vec->y - 360.f) : vec->y);
  vec->z = vec->z < -180.f ? (vec->z + 360.f) : (vec->z > 180.f ? (vec->z - 360.f) : vec->z);
}
inline void wrap180_Vec3f(Vector3f*vec){
向量->x=向量->x<-180.f?(向量->x+360.f):(向量->x>180.f?(向量->x-360.f):向量->x);
向量->y=向量->y<-180.f?(向量->y+360.f):(向量->y>180.f?(向量->y-360.f):向量->y);
向量->z=向量->z<-180.f?(向量->z+360.f):(向量->z>180.f?(向量->z-360.f):向量->z);
}

在AVR上使用C++实现浮点3D?酷!:)不能将
Vector3f&vec
传递给
C
中的函数。要么删除
C
标记,要么简单地使用第二种方法。这取决于您想要的语义。这是变异子吗?还是一个函数来获得一个新的向量?另请参见:
+
vs
+=
。请选择一种语言。(删除我的答案,因为我对AVR不太了解。我认为这仍然是正确的,但我现在还没有时间去弄清楚——无论出于什么原因——AVR gcc是否不做RVO。当有疑问时,请衡量选民是否关心解释?实际上这并不明显,因为你已经错过了“内联”的要点。”。永远不会调用该函数。@Myforwik,即使函数是内联构造函数,并且使用了赋值运算符。我同意这一点并不明显。1)该函数应该是内联的2)所有成员都在更改。我确实希望看到程序集的比较。@使用内联说明符的pmr不能保证函数将内联。而且,如果函数是内联的,那么dot并不意味着由值传递的对象的副本不会被创建。AVR C++编译器能够使用引用。所以我不需要使用指针!
inline void wrap180_Vec3f(Vector3f *vec) {
  vec->x = vec->x < -180.f ? (vec->x + 360.f) : (vec->x > 180.f ? (vec->x - 360.f) : vec->x);
  vec->y = vec->y < -180.f ? (vec->y + 360.f) : (vec->y > 180.f ? (vec->y - 360.f) : vec->y);
  vec->z = vec->z < -180.f ? (vec->z + 360.f) : (vec->z > 180.f ? (vec->z - 360.f) : vec->z);
}