Нужно четкое представление о структуре timepec
В моем проекте я использую struct timespec
следующее
struct timespec start, end;
clock_gettime(CLOCK_REALTIME,&start);
/* Do something */
clock_gettime(CLOCK_REALTIME,&end);
Возвращает значение как ((((unsigned64)start.tv_sec) * ((unsigned64)(1000000000L))) + ((unsigned64)(start.tv_nsec))))
Может кто-нибудь сказать, почему мы используем unsigned64
формат, а также помочь мне понять эту структуру в деталях? Я использую этот код в своем исследовании о вычислении времени с точностью до наносекунд для времени выполнения кода
1 ответ
32-разрядный тип без знака (например, unsigned int
на современных платформах) имеют максимальное значение чуть более четырех миллиардов. Если у вас есть 5 и умножьте это на один миллиард (как в коде, о котором идет речь), вы получите значение в пять миллиардов, большее, чем может содержаться в 32-битном беззнаковом типе. Введите 64-битные типы, которые могут содержать гораздо более высокие значения (18446744073709551615
чтобы быть более точным, сравнить с 32-битным максимальным значением без знака только 4294967295
).
Кстати, код может быть упрощен как
start.tv_sec * 1000000000ULL + start.tv_nsec
Это упрощение возможно, потому что компилятор автоматически преобразует типы и значения с более низкой точностью в более точные при необходимости. Как у вас есть unsigned long long
(вот что ULL
означает) буквальное значение в выражении, остальная часть выражения также будет преобразована в unsigned long long
и результат будет иметь тип unsigned long long
,