传递和分配时保护一些内存
Safe some memory when passing and assigning
我是 C++ 的新手(来自 C#),我想从一开始就掌握这些内存内容。
在下面的片段中,WorldChunkCoordinates
类型的变量按值传递给 WorldChunk
的内联构造函数,然后将传递的坐标分配给 WorldChunk::Coordinates
,我认为这也是一个复制操作.
(复制赋值操作?)
如果我的假设是正确的,那么这有点愚蠢,因为我复制了两次实例。我认为如果我按值传递并按 reference 指针分配,性能会好得多。但是 WorldChunk::Coordinates
不是指针,也不是引用。
WorldChunk(WorldChunkCoordinates Coordinates) {
WorldChunk::Coordinates = Coordinates;
}
有没有办法避免我的程序复制实例两次?
如果是,怎么做?
另外:默认情况下 = 赋值总是复制操作吗?
并且:我怎么知道一个特定的class可能有另一个通过引用复制的复制赋值操作?
首先是一个简单的解决方案:
将您的方法更改为:
WorldChunk(const WorldChunkCoordinates& Coordinates) { WorldChunk::Coordinates = Coordinates;}
这将导致单个赋值指令,因为坐标是一个参考。
默认构造的赋值运算符按成员赋值。
赋值运算符的参数(通常)是对象的 const 引用,这样您就不会复制参数。
顺便提个小教程:http://www.cplusplus.com/doc/tutorial/我认为非常好。
C++ 中用户类型函数参数的约定是通过常量引用 (const MyType&) 传递输入参数,并通过引用传递输入输出参数 (MyType&)。
这是一个已知且已解决的问题,称为 initializer list(不要与容器混淆)。看起来像
WorldChunk(WorldChunkCoordinates Coordinates) : Coordinates(Coordinates){}
考虑对变量名使用小写字母。
您也可以使用
WorldChunk(const WorldChunkCoordinates &Coordinates) : Coordinates(Coordinates){}
但解引用比复制更快并不明显,尤其是在考虑编译器优化的情况下。
我是 C++ 的新手(来自 C#),我想从一开始就掌握这些内存内容。
在下面的片段中,WorldChunkCoordinates
类型的变量按值传递给 WorldChunk
的内联构造函数,然后将传递的坐标分配给 WorldChunk::Coordinates
,我认为这也是一个复制操作.
(复制赋值操作?)
如果我的假设是正确的,那么这有点愚蠢,因为我复制了两次实例。我认为如果我按值传递并按 reference 指针分配,性能会好得多。但是 WorldChunk::Coordinates
不是指针,也不是引用。
WorldChunk(WorldChunkCoordinates Coordinates) {
WorldChunk::Coordinates = Coordinates;
}
有没有办法避免我的程序复制实例两次?
如果是,怎么做?
另外:默认情况下 = 赋值总是复制操作吗?
并且:我怎么知道一个特定的class可能有另一个通过引用复制的复制赋值操作?
首先是一个简单的解决方案:
将您的方法更改为:
WorldChunk(const WorldChunkCoordinates& Coordinates) { WorldChunk::Coordinates = Coordinates;}
这将导致单个赋值指令,因为坐标是一个参考。
默认构造的赋值运算符按成员赋值。 赋值运算符的参数(通常)是对象的 const 引用,这样您就不会复制参数。
顺便提个小教程:http://www.cplusplus.com/doc/tutorial/我认为非常好。
C++ 中用户类型函数参数的约定是通过常量引用 (const MyType&) 传递输入参数,并通过引用传递输入输出参数 (MyType&)。
这是一个已知且已解决的问题,称为 initializer list(不要与容器混淆)。看起来像
WorldChunk(WorldChunkCoordinates Coordinates) : Coordinates(Coordinates){}
考虑对变量名使用小写字母。
您也可以使用
WorldChunk(const WorldChunkCoordinates &Coordinates) : Coordinates(Coordinates){}
但解引用比复制更快并不明显,尤其是在考虑编译器优化的情况下。