一种自动检测对象的方法,该方法通过值传递给c++中的函数

automatic way to detect objects passed by value to functions in c++

本文关键字:方法 值传 函数 c++ 一种 自动检测 对象      更新时间:2023-10-16

我和我的联合编码器经常忘记通过引用传递(大)对象,而是通过值传递。这可能会影响性能。在这种情况下,是否可以配置编译器来警告我?有没有可能在一堆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()制作了特殊的宏。