C++ 我是否也应该传递类成员数据作为速度的引用?

C++ 我是否也应该传递类成员数据作为速度的引用?,c++,reference,C++,Reference,我理解通过引用传递对象可以显著提高速度,因为它避免了调用不必要的构造函数,相比之下,我们只传递值 1) 在一个类中有对普通成员数据的引用或指针,例如int&some_int或某些类Foo中的int*p_int,有意义吗 2) 特别是,如果我想在空闲存储上创建所有类对象,那么声明int*p_int这样的类成员在内存增益方面有意义吗 Thx在实现级别,引用只是带有语法糖的指针。当然,指针需要内存,通常每个ptr需要4个字节(对于x86)或8个字节(x64,可能还有其他情况)因此,为原语提供指针可能会

我理解通过引用传递对象可以显著提高速度,因为它避免了调用不必要的构造函数,相比之下,我们只传递值

1) 在一个类中有对普通成员数据的引用或指针,例如int&some_int或某些类Foo中的int*p_int,有意义吗

2) 特别是,如果我想在空闲存储上创建所有类对象,那么声明int*p_int这样的类成员在内存增益方面有意义吗


Thx

在实现级别,引用只是带有语法糖的指针。当然,指针需要内存,通常每个ptr需要4个字节(对于x86)或8个字节(x64,可能还有其他情况)因此,为原语提供指针可能会导致内存膨胀。

此外,取消引用指针也需要一些时间。基本上,你们得到一个指针的值,去那个地址,得到想要的值。在这里,您可以看到2次内存读取(顺便说一下,这可能非常遥远,这对CPU缓存不利),而不是在使用原语时读取1次所以指针可能会导致时间性能下降(不过,我认为,您永远不会面对它,因为它非常微不足道)


不过,如果您想在多个地方共享原语,那么原语的指针(或引用)可能会很有用。但这种情况很少见。

最快的方法是,如果值符合处理器的寄存器,则通过复制来传递它们。编译器将加载处理器的寄存器,然后调用该函数

对于较大的数据,按引用传递和按指针传递之间可能没有速度差异。在任何一种情况下,指针和引用在使用之前都必须被延迟,因此需要额外的指令

另外,需要度量的一种情况是通过复制将结构传递给函数。这将涉及三个操作:将变量复制到堆栈,在接收端增加堆栈大小:从堆栈复制变量

提高性能的目的是设计使用寄存器的函数,并减少对内存的加载和存储量

例如,在ARM7上,从内存中的变量加载寄存器:

  • 加载带有变量地址的寄存器
  • 通过使用地址延迟寄存器加载另一个寄存器。
    有些处理器可以通过在指令中嵌入地址直接从内存加载

在以这种方式编码之前,请分析正确且健壮的代码,以找到性能瓶颈

我发现初始化列表有助于提高性能。

不,这毫无意义。正如我所想。。我唯一一次需要指向某个int的指针是在我需要操作另一个类的动态成员数据时。不过,我在类中使用对象成员的引用。函数参数中的传递引用可以避免复制,这样可以加快传递速度。在您的示例中,您并没有回避任何事情,事实上,这只会增加复杂性。如果实例必须共享对某个对象或动态/临时数据以及其他情况的访问权限,则类中的引用/指针是有意义的,但不是在这里。@user2802841:你的意思是我应该尝试让所有成员函数都引用,比如double Foo::Poo(int&some_int)?@user2856452这取决于,对于int/float这样的小类型,可能没有意义。但是对于更大的结构/类,如std::vector、std::string或您自己的类,如果可能的话,您应该使用常量引用。