有关clock()从<ctime>生成的时钟节拍计数的问题。(在其他questions中介绍了clock()的用法)
在我的系统上,clock_t是long的别名,根据我的编译器的<climits>,它的最大值是2147483647。
clock_t delay = clock_t(10) * CLOCKS_PER_SEC;
clock_t start = clock();
while(clock() - start < delay); //Note Semi-colon here makes this null statement
std::cout << clock();运行这个,我得到了大约10060个。这与#defined (对于我的系统)为1000的CLOCKS_PER_SEC是一致的。
因此,如果有1000个CLOCKS_PER_SEC,那么2147483647 / 1000 = 2147483.647秒,这大约是24-25天。
我不确定这是否真的是由C++定义的行为,但我注意到,超出long限制的常见行为是换行到负端。
例如,
long m = long(2147483647);
std::cout << ++m << std::endl;输出:-2147483648
因此,假设程序在初始化start之前已经运行了很长时间,并且start恰好被初始化为2147483647 (最大可能的long值)。
在这一点上,我假设我们应该开始包装clock()返回的值,以便在我们再次接近2147482649的时候获得像- 2147483647这样的值。因此,现在我的原始代码可能需要很长时间才能完成循环,比预期的延迟要长得多。
这是实际的行为吗?此样式的pause是否应仅用于延迟小于一定数量的延迟?还有没有其他的检查可以保证这个“安全”?
发布于 2012-08-13 23:08:10
当你溢出一个带符号的整型时,会发生什么是由实现定义的,并且可能是一个信号。是的,这意味着clock()只能在进程开始后的一段固定时间内使用,而且可能只有在实现确保第一次调用总是返回0的情况下才能使用(我所知道的所有实现都是这种情况)。
发布于 2012-08-13 23:28:06
用法: GetTickCount64();
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724411(v=vs.85).aspx
发布于 2012-08-13 23:06:40
如果clock_t被定义为带符号类型,那么是的,这是预期的行为。
如果您关心回绕,则始终可以将clock_t值转换为unsigned long (这意味着您假设clock_t不比long宽),并存储/比较该值。
https://stackoverflow.com/questions/11936951
复制相似问题