传递和分配时,请确保内存安全 我是C++的新手(来自C语言),我想从一开始就获得内存。br> 在下面的截图中,类型为WorldChunk Coordinates的变量通过值传递给WorldChunk的内联构造函数,然后将传递的坐标分配给WorldChunk::Coordinates,我认为这也是一个复制操作 (复制分配操作?

传递和分配时,请确保内存安全 我是C++的新手(来自C语言),我想从一开始就获得内存。br> 在下面的截图中,类型为WorldChunk Coordinates的变量通过值传递给WorldChunk的内联构造函数,然后将传递的坐标分配给WorldChunk::Coordinates,我认为这也是一个复制操作 (复制分配操作?,c++,memory,pass-by-value,copy-assignment,C++,Memory,Pass By Value,Copy Assignment,如果我的假设是正确的,那么这将有点愚蠢,因为我复制了两次实例。我认为如果我通过值传递并通过引用指针赋值,性能会更好。但是WorldChunk::Coordinates既不是指针也不是引用。 WorldChunk(WorldChunkCoordinates Coordinates) { WorldChunk::Coordinates = Coordinates; } 有没有办法防止我的程序复制实例两次? 如果是,怎么做? 另外:默认情况下是否分配给=始终是复制操作? 和:我如何知道特定类可

如果我的假设是正确的,那么这将有点愚蠢,因为我复制了两次实例。我认为如果我通过值传递并通过引用指针赋值,性能会更好。但是
WorldChunk::Coordinates
既不是指针也不是引用。

WorldChunk(WorldChunkCoordinates Coordinates) {
   WorldChunk::Coordinates = Coordinates;
}
有没有办法防止我的程序复制实例两次?
如果是,怎么做?

另外:默认情况下是否分配给=始终是复制操作?

和:我如何知道特定类可能有另一个通过引用复制的复制分配操作?

首先是一个简单的解决方案:

将您的方法更改为:

WorldChunk(const WorldChunkCoordinates& Coordinates) {  WorldChunk::Coordinates = Coordinates;}
这将导致一条赋值指令,因为坐标是一个引用

默认构造的赋值运算符按memberwise赋值。 赋值运算符的参数(通常)是对对象的常量引用,因此您不会复制该参数


顺便说一句,一个小教程:在我看来这是非常好的。

首先是一个简单的解决方案:

将您的方法更改为:

WorldChunk(const WorldChunkCoordinates& Coordinates) {  WorldChunk::Coordinates = Coordinates;}
这将导致一条赋值指令,因为坐标是一个引用

默认构造的赋值运算符按memberwise赋值。 赋值运算符的参数(通常)是对对象的常量引用,因此您不会复制该参数


顺便说一下,在我看来,这是非常好的。

< P>用户类型函数参数的C++约定是通过const引用(const MyType &)输入参数,并引用In Out-Tosits(MyType).< /P> < P>用户类型函数参数的C++约定,可以通过const引用。(const MyType&)表示输入参数,而通过引用表示输入输出参数(MyType&)。

这是一个已知且已解决的问题,称为(不要与容器混淆)。如下所示

 WorldChunk(WorldChunkCoordinates Coordinates) : Coordinates(Coordinates){} 
考虑使用小写字母作为变量名

你也可以使用

 WorldChunk(const WorldChunkCoordinates &Coordinates) : Coordinates(Coordinates){} 

但不明显的是,取消引用比复制快,特别是在考虑编译器优化时。

这是一个已知且已解决的问题,称为(不要与容器混淆)。看起来像

 WorldChunk(WorldChunkCoordinates Coordinates) : Coordinates(Coordinates){} 
考虑使用小写字母作为变量名

你也可以使用

 WorldChunk(const WorldChunkCoordinates &Coordinates) : Coordinates(Coordinates){} 

但不明显的是,取消引用比复制快,特别是在考虑编译器优化时。

通常使用
worldcunk(const-worldcunkcoordinates&Coordinates)
将副本数量减少到一个。通常使用
worldcunk(const-worldcunkcoordinates&Coordinates)
这将副本数量减少到一份。我认为这个答案和其他两个答案可以合并为一个答案,以获得“最佳答案”@KABoissonneault进行了相应的编辑。您知道init列表的幕后发生了什么吗?因为就我而言,参数现在是按值传递的,存储在堆栈上,并且不能/不应该通过将引用移出范围而离开方法。(在其他示例中,通过const ref,然后使用init list,这不是更有意义吗?)@可能是NoelWidmer。经验法则是传递大于8字节的内容作为引用,其余按值传递。编译器优化可能会处理它。我会使用>=64位的引用。听起来不错。你是说编译器也会修改它吗?我不知道编译器优化会走那么远。在C中,我们通常使用大写字母s、 但我想我应该换一下,因为所有的答案都是小写的。但不确定为什么。我认为这个答案和其他两个答案可以合并成一个答案,成为“最佳答案”@KABoissonneault进行了相应的编辑。您知道init列表的幕后发生了什么吗?因为就我而言,参数现在是按值传递的,存储在堆栈上,并且不能/不应该通过将引用移出范围而离开方法。(在其他示例中,通过const ref,然后使用init list,这不是更有意义吗?)@可能是NoelWidmer。经验法则是传递大于8字节的内容作为引用,其余按值传递。编译器优化可能会处理它。我会使用>=64位的引用。听起来不错。你是说编译器也会修改它吗?我不知道编译器优化会走那么远。在C中,我们通常使用大写字母s、 但是我想我应该切换,因为所有内容都是小写的。不确定为什么。我知道那个教程(实际上在我旁边有一个印刷版)谢谢你的正确答案:)我知道那个教程(实际上在我旁边有一个印刷版)谢谢你的正确答案:)