2015-12-14 3 views
-1

я был просто интересно, отличаются ли эти две строки кода:Я правильно интерпретирую сборку сборки Visual Studio?

bool done = false; 
bool done(false); 

кажется, что второй будет быстрее, так как в первом случае мы называем конструктор по умолчанию, а затем присвоить значение. Если во втором мы вызываем только конструктор.

(Может быть, это должно быть свой вопрос?)

я застрял в контрольной точке и взглянули на выходе ассемблере для обеих линий. Они точно так же:

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

Am Я прав, заключая поэтому, что две линии совпадают, или по-крайней мере, компилятор оптимизирует один из них?

Правильно ли это работает?

+1

Скалярные типы не имеют конструкторов. –

+0

@KerrekSB Ahh, ладно. Поскольку синтаксис совпадает с синтаксисом конструктора в строке 2, я понял, что это так. Полагаю, это не так! – Greeny

ответ

2
bool done = false; 
bool done(false); 

кажется, что второй будет быстрее, так как в первом случае мы называем конструктор по умолчанию, а затем присвоить значение. Если во втором мы вызываем только конструктор.

No. В первом случае вы технически создать временную bool значение и использовать копию, что для инициализации done. Тем не менее, все компиляторы будут оптимизировать копирование и инициализировать done напрямую. И сначала он не инициализируется по умолчанию.

Во втором случае вы используете прямую инициализацию done. Никаких копий не создается.

Конечно, для значения bool это не имеет значения.

Единственная разница, которую вы увидите в некоторых типах class, заключается в том, что если копирование отключено (с = delete), первая версия не будет компилироваться (хотя компилятор также может оптимизировать любые копии для объектов класса). Если он компилируется, полученный код будет таким же.

2

bool является фундаментальным интегральным типом в C++. У него нет конструктора, и строки точно такие же. Кроме того, нет необходимости в оптимизации, поскольку операция представляет собой простое назначение нуля.

+0

Ах, ладно. Как насчет того, заменили ли мы bool пользовательским типом? Является ли строка 1 медленнее, чем строка 2? Кроме того, что касается выхода ассемблера, является ли это правильным способом увидеть, работает ли действие A быстрее/медленнее, чем действие B? – Greeny

Смежные вопросы