0

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

1) 在一个类中拥有对琐碎成员数据的引用或指针是否有意义,例如某些类 Foo 中的 int& some_int 或 int* p_int?

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

谢谢

4

3 回答 3

1

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

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

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

于 2013-11-11T20:15:02.517 回答
1

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

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

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

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

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

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

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

于 2013-11-11T20:33:11.717 回答
0

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

于 2013-11-11T22:04:36.920 回答