在不同的运算符=重载之间,编译似乎没有遵循正确的路径
Compilation seems not to follow the correct path among different operator= overloads
我有两个矩阵类,一个用于CPU,另一个用于GPU,分别为Matrix
和CudaMatrix
。声明和定义位于文件.h
、.cpp
、.cuh
和.cu
中。在main
中,我有
Matrix<int2_> foo1(1,2);
// Definition of the elements of foo1...
CudaMatrix<int2_> foo2(1,2);
cout << typeid(foo1).name() << "n";
cout << typeid(foo2).name() << "n";
// Equality
foo2=foo1;
现在,我在CudaMatrix
和Matrix
之间没有operator=
过载,但我有下面的operator=
过载
const CudaMatrix& operator=(const CudaMatrix<LibraryNameSpace::int2_>&);
在两个CCD_ 12之间。发生的情况如下:
- 两个
typeid
返回foo1
和foo2
的正确类 - 上面的
operator=
重载是在运行时为foo2=foo1
赋值而编译和调用的。相反,我本以为会出现汇编错误 - 赋值的结果导致
foo2
的正确结果
我正在使用Visual Studio 2010,并在发布模式下进行编译。
有人知道为什么会出现这种明显不合逻辑的行为吗?
谢谢。
它们之所以能起作用,关键是因为您同时拥有复制构造函数和显式复制赋值运算符。这两件事加在一起,使一个看似未定义的case正确发挥作用。所以当你这样做的时候:
Matrix<int2_> foo1(1,2);
CudaMatrix<int2_> foo2(1,2);
foo2 = foo1;
发生的情况与此相当:
Matrix<int2_> foo1(1,2);
CudaMatrix<int2_> foo2(1,2);
// foo2 = foo1;
{
CudaMatrix<int2_> x(foo1); // copy constructor
foo2 = x; // Copy assignment
}
请注意,在这里,您应该注意设备内存使用的影响(即,两个设备内存分配和两组您拥有的API调用)。
值得指出的是,这不是CUDA特有的,它是C++98对象模型的标准特性。如果你想了解更多关于这是如何以及为什么工作的(以及为什么看似类似的反例不起作用),你可能会从修改三条规则中受益。
相关文章:
- 基于编译器选项的编译二进制路径
- 良好做法:如何定义用于编译的外部库的路径
- 如何更改 clang 的预编译头文件的路径
- Qt 静态编译无法读取路径
- 只有已知执行路径的模板编译
- 已编译的 protobuf 文件的意外输出路径
- 崇高文本 3 - 在终端中编译并运行 C++ 程序(路径包含空格)
- 使用 glibc 2.7 包含路径编译失败
- 将库安装到编译中未包含的路径后,编译失败
- GCC makefile 编译和语法。如何调用 c 编译器以及包含多个路径
- 如果库的包含路径设置不符合预期,如何引发编译错误
- 编译C++中动态链接库,存在运行路径问题
- Simple_ls.cpp的C++Boost编译错误-未找到对Boost的引用::文件系统::路径::文件名
- 在MacOS上编译一个动态库,库搜索路径指向同一目录(CMake)
- GCC - 多个预编译标头和特定路径
- 在C++中编译时提供库路径的更好方法
- 已编译的应用想要从绝对路径加载 DLL
- Qt 创建者编译错误"找不到 UIC.exe从 msvc 2012 路径"
- 在 mingw 下编译时出现路径查找文件名错误
- G++ libc.so 绝对路径交叉编译错误