Есть код по типу:
if (1)
cout << 1;
Т.к. 1 - int, то оно неявно конвертируется в bool. Но у меня вопрос, как происходит эта неявная конвертация? Например во время компиляции компилятор сам допишет туда (bool)1 или как-то иначе?
Есть код по типу:
if (1)
cout << 1;
Т.к. 1 - int, то оно неявно конвертируется в bool. Но у меня вопрос, как происходит эта неявная конвертация? Например во время компиляции компилятор сам допишет туда (bool)1 или как-то иначе?
Такой код, конечно, будет оптимизирован. Но можно попробовать скомпилировать без оптимизации и посмотреть результат в ассемблере.
Рассмотрим код:
int a = 1;
if (a)
std::cout << 1;
GCC с опцией -O0 генерирует такой ассемблер:
mov DWORD PTR [rbp-4], 1
cmp DWORD PTR [rbp-4], 0
je .L2
mov esi, 1
mov edi, OFFSET FLAT:_ZSt4cout
call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
.L2:
За сравнение отвечают первые 3 строки. Сначала идёт команда mov, которая записывает в память число для сравнения. Далее, выполняется команда cmp. Она вычитает из нашей единицы число 0. Это не бессмысленное действие, потому что при этом выставляются специальные флаги, по которым можно узнать, как относятся друг с другом сравниваемые числа (больше, меньше или равны). Команда je перенаправляет выполнение кода на участок, который следует после тела оператора if, если сравниваемые числа были равны. Мы знаем, что 1 > 0, поэтому этого не произойдёт, но эта оптимизация не была произведена.
Тут надо понимать, что машинные команды ничего не знают о типе bool. И вообще о типах. Все сравнения происходят в ассемблере подобным образом в целых числах. Есть ещё похожая по назначению команда test.
int MyClass::abc(){ a = 1; }, насколько я знаю это будет эквивалентно следующему - int MyClass::abc(){ this->a = 1; }. Так вот, у меня вопрос этот самый this-> компилятор как будто припишет к коду, или он прост сгенерирует ассемблерный код, как будто там, что то было?
– n 1 k z z z
Apr 25 '21 at 06:44
a есть в области видимости, и если оно единственное и подходит по типу - просто скомпилирует этот код...
– Harry
Apr 25 '21 at 08:20