临时对象创建

Posted

技术标签:

【中文标题】临时对象创建【英文标题】:Temporary object creation 【发布时间】:2012-10-22 20:29:39 【问题描述】:

有谁知道是否可以在任何 C++ 上启用任何类型的日志记录 兼容的编译器(Visual Studios、g++ 等),以便我可以发现临时对象的创建时间?

例如:

假设我有一个函数f(char x),但我用f(46) 调用它

我会在日志中看到 -

temporary char created promoting int @ function param f(46)(或类似的东西)

我已通读 VS 编译器开关选项,看来这不是 一个选项。

我了解,在新标准中有 rvalue reference (&&) 的概念,可用于检测大多数临时移动语义,但这涉及添加新代码/兼容编译器。

那么这可以做到吗?或者这是编译器的特权知识?

【问题讨论】:

即使是很短的代码也可以生成大量的副本和临时文件。这将没有你想象的那么有用。 46 是一个完全有效的char 值,将其按值传递给函数是正确的做法。你确定你没有读过一些 C 核心程序员写的 FUD 文章吗? 抱歉回复太晚了——我知道它会产生大量数据,但它会很有用。无论如何,我在这个阶段认为它无法完成,所以我可能会考虑自己做。无论如何感谢您的帮助。 @Bo,是的,那错了,我应该输入 f(const char& x) 【参考方案1】:

IDE 中的内联注释更有用(因为我假设您想通过最小化其中一些临时值来进行优化?)。实际上,最简单的方法是修改 GCC 或 g++ 并让它们与 Visual Studio 插件或其他东西对话。他们可以用寄存器分配和所有东西来注释。哇,那真的很有帮助。

除非有这样的努力,而且我不知道,最好的方法就是学习阅读程序集。在 Visual Studio 中,您可以让编译后的程序集与源代码内联显示,这非常有用。

【讨论】:

以上是关于临时对象创建的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我们有 const 引用时创建临时对象?

在声明然后分配对象的情况下创建的临时对象

通过构造函数隐式类类型转换创建的临时对象啥时候被销毁

如何避免频繁创建临时对象

如何创建临时中间对象以传递给 Stream 中的下一个方法

如何在不创建临时对象的情况下迭代嵌套的 TreeMap