一种自动检测对象的方法,该方法通过值传递给c++中的函数
automatic way to detect objects passed by value to functions in c++
我和我的联合编码器经常忘记通过引用传递(大)对象,而是通过值传递。这可能会影响性能。在这种情况下,是否可以配置编译器来警告我?有没有可能在一堆c++源文件中自动检测到它。。。也许是某人已经编写的正则表达式?
更新:谢谢大家的帮助。所有答案中的一个问题是,它们只适用于我写的课程。。。不适用于现有类。。如CCD_ 1。我可以对它们进行子类化,但这太乏味了
您可以将类型的复制构造函数声明为private
-由于在按值传递对象时调用了复制构造函数,因此在编译时,您的代码将在任何按值传递的调用站点出错。
如果编译器支持的话,你也可以使用新的c++11
支持delete
不需要的构造函数/析构函数。点击此处查看详细信息。
如果您确实需要在代码中使用copy ctor,那么另一个选项是在copy ctor中添加调试断点。然后,您可以逐步完成程序的调试构建,并检查何时调用复制ctor。
希望这能有所帮助。
编辑:由于您希望在标准容器上检测复制tor的使用,所以事情就不那么简单了。您可以尝试一些类似的方法,这是一种非常丑陋的破解方法,通过一个禁用了复制ctor的包装器类来委派所有std::vector
实例。
注意代码中的警告。我只会用这种东西来识别你的传递值问题,然后删除它——恢复到完全使用std::vector
等
如果您想永久禁止复制标准容器,您可以编写自己的封装器类来封装(而不是继承)标准容器。
一种方法是让您的重对象从类继承,比如:
struct heavy {
struct heavy_copy_ctor_invoked {};
heavy(const heavy&) {
typename boost::mpl::print<heavy_copy_ctor_invoked>::type _;
}
};
struct foo : heavy { ...
每次调用重拷贝ctor时,mpl都会抛出一个警告。
只需将大对象的复制构造函数和运算符设置为私有即可。在QT中,他们为Q_DISABLE_COPY()制作了特殊的宏。
相关文章:
- 如何使用curlpp通过POST方法上传文件和json数据
- 为什么可以将左值传递给"std::async",即使它引用了右值
- 在类中分配具有方法值的变量
- 当值传递给C++中的运算符重载函数时会发生什么
- 如何将非可变参数值传递给 fmt::format?
- 将 qml 项目值传递给 cpp 后如何与它们进行交互?
- NDK:将文本字段值传递给 c++ 字符串
- 如何将值传递给 lambda 函数
- 如何在C++中将std::string值传递给RegSetValueEx()
- 如何将 c ++ 变量的值传递给 hadoop HDFS 的 bash 系统命令?
- C++ 通过参数将值传递给 char 数组
- 如何将值传递给MFC消息映射函数on_command
- 使用JNI将长值传递给Java
- 如何在不使用 Argv 和 Argc 的情况下将 Sum 值传递给 C++ 程序
- 将C++方法返回传递给Pro*C过程
- C++ 将值传递给 fStream
- 如何将函数中的多个值传递给C++中的不同函数
- 将多个解析值传递给 addPositionalArgument 函数
- 将方法指针传递给pthread_create时,我的方法签名有什么问题
- 一种自动检测对象的方法,该方法通过值传递给c++中的函数