iostream — Цепочка вызовов с плавающей точкой в ​​выходном потоке C ++

В C ++, когда я делаю

std::cout << 1.2;

какова фактическая цепочка функций, вызываемых для отображения числа? Я понимаю, что это зависит от компилятора, но меня особенно интересует реализация Gnu libstdc ++.

В C вызов printf делегатов для vfprintf, который через таблицы переходов вызывает __printf_fp в glibc. Я ищу аналогичную цепочку в чистом C ++.

2

Решение

Понятно, это вызовет ostream :: оператор<< во-первых, но это может быть специфичным для библиотеки за этим. Лучший способ ответить на этот вопрос — отладить код и следить за функциями по мере их появления. Это не только скажет вам, какие функции вызываются, но и расскажет вам о крайних случаях и обработке ошибок, которые происходят. Глядя на код может помочь, но это, вероятно, запутанным.

Используя этот код:

std::cout << 1.2f;

… Вот что делает Visual Studio 2012 без шума:

  1. оператор<<(плавать _Val) (Станд :: basic_ostream<_Elem, _Traits>)
    1. Инициализировать государство переменная к хорошо.
    2. Вызов use_facet<_Facet> (const locale & _Loc) (std), чтобы получить фасет num_put.
    3. Вызов num_put (_OutIt _Dest, ios_base& _Iosbase, _Elem _Fill, double _Val) (std) записать число с плавающей точкой в ​​выходной поток (преобразованный в double), используя локальное форматирование. Внутренне это:
      1. Проверяет точность, такие фиксированный, чтобы увидеть, было ли изменено форматирование по умолчанию.
      2. Форматирует число и записывает его в выходные данные в виде символов для текущего итератора, используемого потоком.
    4. Установите переменную состояния в плохой если операция не удалась.
    5. Вызов SetState в состояние.

Таким образом, большая часть работы фактически выполняется в фасете num_put, который записывает в итератор для выходного потока.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]