C ++在对象周围传递的速度有多快?

时间:2010-04-10 23:43:33

标签: c++

假设我们正在运行已编译的C ++二进制文件:

传递int(例如函数函数或将其写入变量)比传递结构/类对象(如下所示)慢?

class myClass
{
      int a;
      int b;
      char c;
      vector d;
      string e;
}

6 个答案:

答案 0 :(得分:7)

这取决于几个因素,包括复制构造函数的复杂性以及编译器是否可以执行elision

答案 1 :(得分:3)

任何时候复制某些东西需要多长时间才会直接导致该东西有多大以及它的复制构造函数做了什么;很明显,这个类比单个int大,所以它会慢一些。如果您传递指针或通过引用传递事物,则不需要复制并且需要相同的时间

答案 2 :(得分:2)

将指针或引用传递给周围的对象与传递整数相同。

但是,如果您传递的是实际对象(而不是指向它们的指针),则可能最终会生成由对象组成的副本,这很昂贵。很多可能的副本可能会被优化掉,但它仍然会发生。

答案 3 :(得分:2)

传递myClass的实例比传递int变量要慢,因为该类封装的内容超过int。相反,你应该问一下,绕过构成成员变量的各种原语是否比传递将它们全部包装为一个的单个对象要慢。答案是否定的,这两种方法应该表现出相同的性能。一个类中没有魔法:一个类只是将数据与函数相关联,如果你试图在没有C ++工具的情况下自己表达这一点,你最终会得到相同的性能 - 或者,更像是 - 比C ++编译器已经给你的性能更差。

也就是说,C ++允许您覆盖给定对类型的赋值运算符,它还允许您编写自己的复制构造函数,以便实例根据同一个类的另一个实例构造。这两个是您编写的函数,因此复制的性能取决于这些函数的性能。如果您不提供自己的复制机制并且使用C ++提供的那个,那么性能是最佳的,因为复制是按位完成的。也就是说,每个成员本身都会被复制。

答案 4 :(得分:1)

首先,很大程度上取决于您是通过引用还是按值传递对象。

在C#和Java中,您总是通过引用传递对象,但在C ++中,您可以在堆栈上传递对象的复制(即按值传递)。这样做涉及在内存中制作对象的物理副本,这意味着一对构造函数/析构函数调用(至少)。

传递int可以通过值或引用来完成。如果您按值传递,则将int类型(假设为32 bits)复制到堆栈中。如果你通过指针传递,你将一个地址(再次,让我们说32 bits)复制到堆栈上。堆栈使用方面确实没有任何区别。在传递引用的情况下,调用函数必须取消引用指针才能访问int参数的值,因此会有一些额外的代码(并且可能会降低性能)。 / p>

通过值与引用传递对象(或结构)更有趣,因为它们可能具有非常不同的内存占用(取决于类/结构的大小)。

答案 5 :(得分:0)

这很大程度上取决于你班上的成员。

通常您提供一个复制构造函数,它将所有需要的数据复制到您的类的目标实例。复制构造函数通常由编译器优化,因此传递具有2个int字段的类和仅传递2个int之间没有区别。