Вопрос

В чем разница между двумя time_tы, возвращенные difftime( time_t t1, time_t t2) метод как double?Я не понимаю, откуда берется требование к точности.

Это было полезно?

Решение

Потому что time_t просто определяется в стандарте как arithmetic type capable of representing times.

Вот, пожалуй, и все, что здесь сказано по этому поводу.Это не обязательно должно быть целое число, оно не обязательно должно представлять секунды.Он может быть только кратен десяти или иметь тип с плавающей запятой, способный представлять время с разрешением до 10-43 секунд.

Цитата из C99 7.23.1 Components of time является (слегка перефразировано):

Объявленными типами являются clock_t и time_t, которые являются арифметическими типами, способными представлять времена.Диапазон и точность времени, которые можно представить в clock_t и time_t, определяются реализацией.

Отсюда люди, которые вслепую рассчитывают разницу во времени с:

delta = time_end - time_begin;

могут обнаружить, что их код работает не на всех платформах.

Сейчас я не знаю насквозь ни одной платформы, где с тех пор прошло не так много секунд, но меня гложут предположения Нравится это раньше, например, предполагая A через Z являются смежными, тогда как, на самом деле, это не требуется и не так хорошо работает на мейнфреймах, использующих EBCDIC.И, да, они все еще в тяжелый используйте, несмотря на то, что, по-видимому, они умирали с 60-х годов :-)

В обосновывающем документе C99 говорится следующее:

Типы clock_t и time_t являются арифметическими, поскольку значения этих типов должны, в соответствии с существующей практикой, иногда сравниваться с -1 (показателем "не знаю"), соответствующим образом приведенным.

Однако никакие арифметические свойства этих типов Стандартом не определены, чтобы предоставить реализациям максимальную гибкость в выборе диапазонов, точности и представлений, наиболее подходящих для их предполагаемого применения.Представление не обязательно должно быть количеством какой-либо базовой единицы;предположительно, реализация может представлять различные компоненты временного значения в виде подполей целочисленного типа.

Другие советы

Несмотря на то, что он повсеместно мыслится — и реализуется — как интегральный тип, представляющий секунды с начала какой-либо эпохи, time_t на самом деле формально не определен как таковой, поэтому вы не смогли бы переносимо использовать результат difftime, если бы это был time_t.Что касается других альтернатив: int слишком мал в некоторых обстоятельствах (как есть long) и long long он не переносим.

Возможно, потому что это самый общий арифметический тип.И это позволяет лучше, чем вторая точность, если базовый генеракодицетагкод поддерживает его.

Причина этого заключается в том, что для этого типа не определены арифметические операции time_t, возвращая значение double , это подразумевает, что вы можете использовать результат в вычислениях.

IOW, если вы добавите два time_t сопоставляя значения друг с другом, вы находитесь на небезопасной территории, поскольку может возникнуть различное поведение, если time_t определено как unsigned int или обычный int - в зависимости от вашей платформы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top