【发布时间】:2016-07-08 08:19:33
【问题描述】:
在 Visual C++ 2013 中,为 const 引用分配临时值是合法的,例如
const int& a = 1;
在一个大型软件项目中,我偶然发现了一行代码需要大约 10 毫秒才能执行:
const std::vector<Item>& desc = (hasItems) ? instance->getItems() : std::vector<Item>();
Item 是一个大约 20 字节的结构,instance->getItems() 返回一个 const std::vector
const std::vector<Item>& desc = std::vector<Item>();
也需要 10 毫秒,而
std::vector<Item> items;
const std::vector<Item>& desc = items;
如您所料,几乎是即时的,即 0.00.. 毫秒。
问题是,我可以在现有的复杂软件项目中可靠地重现此问题,但在任何精简的最小示例中,两个版本的运行速度都一样快。我已经在启用了优化的发布版本中测试了所有这些。这些优化之一是否有可能使此异常为 const 引用赋值真的很慢?我真的很想知道是什么导致了这种行为。有人知道是什么原因造成的吗?
接下来,是否有为我意外禁用的 const 引用分配值的警告?如果是,它的 id 是什么?如果编译器可以指出代码中发生这种情况的其他地方,那将会很方便。
编辑:计时是在感兴趣的代码之前和之后使用简单的 CPU 时钟完成的,除以每秒的时钟周期。它不太准确,但可以让您大致了解 10.something 和 0.something 之间的区别。而且它不会以任何方式波动,在这个特定的例子中它是完全可重现的。执行时间有显着差异。
【问题讨论】:
-
在 C++ 中将临时变量绑定到 const 引用是合法的(实际上是一个非常有用的功能),因此没有警告:herbsutter.com/2008/01/01/…
-
旁注:这不是作业。
-
你是如何测量这条线需要 10 毫秒的?
-
我认为测量有问题。 10 毫秒是很多时间,我相信它与您的计时方法的精度有关(例如,GetTickCount 精度变化高达 16 毫秒或更多)。如果您比较生成的汇编代码,您将确切地看到发生了什么,并且我相信不会有太大差异
-
@PcAF 因为它是一个初始化。
标签: c++ visual-c++ const-reference