关于来自clock()
的{{1}}生成的时钟节拍计数的问题。 (其他questions)
<ctime>
的使用情况
在我的系统clock()
上是clock_t
的别名,根据我的编译器的long
,其最大值为2147483647。
<climits>
运行这个我得到大约10060.这与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();
CLOCKS_PER_SEC
d(对于我的系统)一致为1000。
所以,如果有1000 #define
,那么2147483647/1000 = 2147483.647秒,这大约是24-25天。
我不确定它是否实际上是由C ++定义的行为,但我注意到超出CLOCKS_PER_SEC
限制的常见行为是包裹到负面。
例如,
long
输出:-2147483648
假设程序在初始化long m = long(2147483647);
std::cout << ++m << std::endl;
之前已经运行了很长时间,并且start
碰巧被初始化为2147483647(最大可能start
值)。
此时,我假设我们开始包装long
返回的值,因此当我们再次接近2147483647时,获取-2147482649等值。
所以现在我的原始代码可能需要很长时间来完成循环,比预期的延迟要长得多。
是实际行为吗?这种风格暂停只应用于少于一定数量的延迟吗?是否还应该进行其他检查以使其“安全”?
答案 0 :(得分:3)
当溢出有符号整数类型时会发生什么?
定义,可能是一个信号。是的,这意味着clock()
可以
仅在过程开始后的固定时间内使用,
并且可能只有在实现确保第一次调用时才会这样
将始终返回0(我知道的所有实现的情况)。
答案 1 :(得分:2)
使用:
GetTickCount64();
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724411(v=vs.85).aspx
答案 2 :(得分:0)
如果clock_t
被定义为签名类型,那么是,这是预期的行为。
如果你担心环绕,你总是可以将clock_t
值转换为unsigned long
(这意味着你假设clock_t
不比long
更宽{1}}),并存储/比较该值。