Представляющий разницу между time_t
Вопрос
В чем разница между двумя 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 - в зависимости от вашей платформы.