MSIL: Лишнее ответвление

По умолчанию класс (ы) потока будет сериализовать bool как 0 или 1. Они также будут читать 0 или 1 при десериализации.

Чтобы напечатать строку (и) true или false, вам нужно использовать модификатор потока std::boolalpha, чтобы изменить поведение потока для печати (или чтения) текстовой версии логических значений. 1110]

См. Ниже:

#include <iostream>
#include <iomanip>

int main ()
{
  bool a = false;
  bool b = true;
  std::cout << std::boolalpha   << a << " : " << b << '\n';
  std::cout << std::noboolalpha << a << " : " << b << '\n';


  // If you want to read a bool as 0 or 1
  bool check;
  if (std::cin >> std::noboolalpha >> check) {
      std::cout << "Read Worked: Got: " << check << "\n";
  }
  else
  {
      std::cout << "Read Failed\n";
  }

  // PS. If the above read failed.
  //     The next read will also fail as the stream is in a bad
  //     state. So make the above test work before using this code.


  // If you want to read a bool as true or false
  bool check;
  if (std::cin >> std::boolalpha >> check) {
      std::cout << "Read Worked: Got: " << check << "\n";
  }
  else
  {
      std::cout << "Read Failed\n";
  }

}
5
задан nzpcmad 23 March 2009 в 21:20
поделиться

2 ответа

Это только происходит в Отладке, не в Выпуске. Я подозреваю, что помогает во время отладки. Это, возможно, позволяет Вам зажимать точки останова середина оператора и видеть возвращаемое значение.

Обратите внимание, что версия выпуска имеет намного более краткий IL:

.method private hidebysig static void Main(string[] args) cil managed
{
    .maxstack 8
    L_0000: ldstr "input"
    L_0005: stsfld string Reflector_Test.Program::input
    L_000a: ldsfld string Reflector_Test.Program::input
    L_000f: call string Reflector_Test.Program::CallMe(string)
    L_0014: stsfld string Reflector_Test.Program::output
    L_0019: ret 
}




.method public hidebysig static string CallMe(string input) cil managed
{
    .maxstack 8
    L_0000: ldstr "output"
    L_0005: stsfld string Reflector_Test.Program::output
    L_000a: ldsfld string Reflector_Test.Program::output
    L_000f: ret 
}
7
ответ дан 14 December 2019 в 09:01
поделиться

Мое предположение - то, что это - шаблонный код для выполнения оператора возврата, компилятор выполняет безусловный переход к последней строке и загружает возвращаемое значение в регистр прежде, чем выполниться ret. JIT оптимизирует его лучше, я думаю, что компилятор не потрудился делать любые оптимизации.

0
ответ дан 14 December 2019 в 09:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: