我正确解释Visual Studio程序集输出吗?

时间:2015-12-14 18:47:32

标签: c++ assembly output

我很好奇这两行代码是否不同:

bool done = false;
bool done(false);

似乎第二个会更快,就像我们调用默认构造函数的第一种情况一样,然后分配值。而在第二个我们只调用构造函数。

(也许这应该是它自己的问题?)

我陷入断点并看了两行的汇编输出。它们完全一样:

    bool done = false;
00F66E7D  mov         byte ptr [done],0  

我是否正确地得出结论,两条线是相同的,或者至少编译器正在优化其中一条线?

这是解决这种问题的正确方法吗?

2 个答案:

答案 0 :(得分:2)

bool是C ++中的基本整数类型。它没有构造函数,并且行完全相同。由于操作是零的简单分配,因此也不需要优化。

答案 1 :(得分:2)

 bool done = false;
 bool done(false);
  

似乎第二个会更快,就像我们调用默认构造函数的第一种情况一样,然后分配值。而在第二个我们只调用构造函数。

没有。在第一种情况下,您在技术上创建临时bool值并使用该副本初始化done。但是,所有编译器都会优化复制并直接初始化done。并且它不是首先默认初始化。

在第二种情况下,您正在使用done的直接初始化。没有创建副本。

当然,对于bool值,这没有任何区别。

对于某些class类型,您将看到的唯一区别是,如果禁用复制(使用= delete),则第一个版本将无法编译(即使允许编译器优化任何副本对于类对象)。如果它编译,结果代码将是相同的。