Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么时候物体足够重以避免复制?_C++_Memory - Fatal编程技术网

C++ 什么时候物体足够重以避免复制?

C++ 什么时候物体足够重以避免复制?,c++,memory,C++,Memory,嗯,我相信这个标题很直截了当。我已经读过很多次,一个人应该避免复制重的物体,这似乎很合理(谁会想成为一个记忆猪?)。问题是,什么时候一个物体应该被认为是重的?有多少成员?当您传递的对象大于指针大小时(通常32位为4字节,64位为8字节),避免复制会更有效 您是否应该通过引用/指针传递它取决于将要做多少额外工作,以及您将如何处理数据。如果您通过引用传递它只是为了创建一个副本并在函数中对其进行修改,那么您就无法达到这个目的。任何时候只要通过引用将其作为常量传递就足够了,那么这样做可能是个好主意 但是

嗯,我相信这个标题很直截了当。我已经读过很多次,一个人应该避免复制重的物体,这似乎很合理(谁会想成为一个记忆猪?)。问题是,什么时候一个物体应该被认为是重的?有多少成员?

当您传递的对象大于指针大小时(通常32位为4字节,64位为8字节),避免复制会更有效

您是否应该通过引用/指针传递它取决于将要做多少额外工作,以及您将如何处理数据。如果您通过引用传递它只是为了创建一个副本并在函数中对其进行修改,那么您就无法达到这个目的。任何时候只要通过引用将其作为常量传递就足够了,那么这样做可能是个好主意


但是,请注意,大多数编译器都足够聪明,可以在编译代码时启用优化,从而优化只读对象的复制。所以你不必担心它,除非它成为一个瓶颈,你可以定量地证明它。

这完全取决于对象是什么以及如何使用它。如果你可以避免复制,为什么不每次都避免它呢?我会说,复制会影响你的性能:)@James McNellis:还有你正在运行的架构。@LuchianGrigore:因为复制简单对象(例如,
int
)比发送和使用引用更便宜。我要补充的是,传递指针更可取,有时是实现某些设计的唯一方法,即指向接口、PIMPL、函数指针等的指针。通过引用传递可防止编译器可能对值执行的某些优化,所以它不是那么简单。C++11似乎也改变了旧的经验法则,一些人建议在以前通过const引用传递的许多地方通过值传递,特别是对于类似值的对象,如std::string,由于移动语义的原因。