如果要在C ++中复制对象(在堆栈上),复制较大的对象会变慢吗?是否立即复制对象,或者以迭代方式复制数据的字节?:
class Small {
public:
int stuff[32];
};
class Big {
public:
int stuff[1024];
};
...
Small small;
Big big;
Small small2 = Small(small); //Faster?
Big big2 = Big(big); //Slower?
很抱歉,但此刻我没有时间对此进行测试。
答案 0 :(得分:1)
需要复制的字节越多,所需的时间就越长。这对您的整体表现是否重要是另一回事。真正的杀手是当副本需要动态内存分配时。无论是在堆栈还是堆上(只要目标内存已经分配),字节的直接副本通常都不会那么糟糕。小心地将大型数组放在堆栈上。
答案 1 :(得分:1)
是的,较大的对象比较小的对象需要更多的时间来复制或移动。
32个整数的数组需要32次操作才能复制或移动 1024个整数的数组需要1024次操作才能复制或移动。
问题在于时差是否显着。使用现代处理器,大多数复制操作大约为纳秒级。那么,(大约)1000纳秒会影响你的程序吗?这取决于。如果您的程序花费数毫秒或更长时间等待I / O,则差异可能不大。
编辑1:
所需的空间量可能比复制时间更重要。
大型物体的一般经验法则是让它们坐下并传递指向物体的指针;避免复制或移动大型物体。与大型物体相比,指针占用的空间更小,复制和移动速度更快。也喜欢引用指针。
编辑2: - 筹码
复制到堆栈取决于处理器和编译器的协议。堆栈不是必需的。
在使用堆栈传递参数和局部变量分配的经典实现中,除了复制对象之外,开销还涉及增加堆栈指针变量。
因此,如果我将32个整数传递给函数,则会有32个复制操作以及对堆栈指针的添加操作。
通常,堆栈空间的关注对于将大对象推送(复制)到堆栈所需的时间更为重要。
您的编译器可能能够通过指针传递您的对象,具体取决于优化级别和其他属性。
答案 2 :(得分:1)
LARGER对象需要更长时间才能复制,而不是进行复制所需的处理。
是的,复制
char [4096] ;
通常需要比复制更长的时间
char [32] ;
然而,还有其他事情需要更长的时间。如果你复制构造函数和赋值运算符做了很多其他的处理,那么通常比移动数据计算密集得多。
处理32个整数的数组并不一定意味着32个指令。某些处理器具有块移动指令。但是,一个块移动指令可能需要多个周期才能执行。
答案 3 :(得分:0)
不一定,虽然显然一个更大的对象意味着更多的数据必须移动,因此需要更长的时间,有些情况下复制的开销更多......
例如
Big b1;
Big b2 = b1;
将是快速的,堆栈到堆栈副本非常快速地分配内存,而副本只是一组快速CPU指令来复制数据,通常是在优化的专用指令突发中。
Small s1;
Small* s2 = new Small(s1);
这可能不会那么快,你必须在堆上分配相对昂贵的内存,然后复制数据。显然,如果Big对象真的很大(并且我无法告诉你这是什么意思,它依赖于堆碎片,堆实现 - 一个存储器副本加分配比上一个例子便宜的点)池会更快,并且执行堆栈复制所花费的时间。)
然后是复制构造方面,你可能有一个单字节数组 对象,但大多数对象有更多的成员变量,并且一个复制ctor单独处理每个,有些甚至具有执行复制所需的专门例程,例如记录复制或锁定一些无法并行访问的共享资源