我还应该将类成员数据作为速度的参考传递吗?

时间:2013-11-11 19:47:50

标签: c++ reference

据我所知,通过引用传递一个对象可以显着提高速度,因为它避免了在比较时调用不必要的构造函数,我们仅仅通过了值。

1)在类中包含对普通成员数据的引用或指针是否有意义,例如INT和放大器; some Foo中的some_int或int * p_int?

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

THX

3 个答案:

答案 0 :(得分:1)

在实现级别,引用只是具有语法糖的指针。当然,指针需要内存,通常每个ptr需要4个(对于x86)或8个字节(x64,可能有其他情况)。 因此,拥有基元指针可能会导致内存浪费。

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

如果你想在几个地方之间共享它,那么原语的指针(或引用)可能很有用。但这种情况很少见。

答案 1 :(得分:1)

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

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

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

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

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

  • 使用变量的地址加载寄存器。
  • 通过使用地址引用寄存器来加载另一个寄存器 某些处理器可以通过在指令中嵌入地址直接从存储器加载。

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

答案 2 :(得分:0)

我发现初始化列表对性能有帮助。