CRT вызывает GetSystemTimePreciseAsFileTime
, если доступно, и GetSystemTimeAsFileTime
в противном случае.GetSystemTimePreciseAsFileTime
дает вам максимально возможный уровень точности (<1us) </a>.
Иногда во время инициализации среды выполнения вызывается функция с именем initialize_pointers
, которая в основном выполняет следующее (декомпилировано и упрощено):
HMODULE hModule = GetModuleHandleW(L"kernel32.dll");
__encodedKERNEL32Functions[0] = (void *)GetProcAddress(hModule, "FlsAlloc");
__encodedKERNEL32Functions[1] = (void *)GetProcAddress(hModule, "FlsFree");
__encodedKERNEL32Functions[2] = (void *)GetProcAddress(hModule, "FlsGetValue");
__encodedKERNEL32Functions[3] = (void *)GetProcAddress(hModule, "FlsSetValue");
...
__encodedKERNEL32Functions[24] = (void *)GetProcAddress(hModule, "GetSystemTimePreciseAsFileTime");
...
В системе с Windows 8 или новее __encodedKERNEL32Functions[24]
будет отличным от нуля.
Затем все сводится к следующему:
std::chrono::system_clock::now()
-> _Xtime_get_ticks
-> __crtGetSystemTimePreciseAsFileTime(FILETIME *)
void __crtGetSystemTimePreciseAsFileTime(FILETIME *lpSystemTimeAsFileTime)
{
void (*f)(FILETIME *) = (void (*)(FILETIME *))__encodedKERNEL32Functions[24];
if (f) // if GetSystemTimePreciseAsFileTime exists
f(lpSystemTimeAsFileTime); // call it
else
GetSystemTimeAsFileTime(lpSystemTimeAsFileTime);
}
По крайней мере, это (примерно) это реализовано в 14.16.27024.1 версии msvcp140.dll и msvcp140d.dll .
Все это, конечно, недокументировано и может быть изменено.
Если вам нужно использовать GetSystemTimePreciseAsFileTime
, вам следует написать свои собственные часы и не полагаться на детали реализации.