0

clock()から生成されたクロックティックカウントに関する質問<ctime>。(の使用法は他の質問clock()でカバーされています)

私のシステムには、コンパイラによる最大値が2147483647のclock_tエイリアスがあります。long<climits>

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になります。これは、d(私のシステムの場合)が1000であることと一致しCLOCKS_PER_SECています。#define

したがって、1000の場合CLOCKS_PER_SEC、2147483647 / 1000 = 2147483.647秒になります。これは、およそ24〜25日であることがわかります。

それが実際にC++によって定義された動作であるかどうかはわかりませんが、long制限を超える一般的な動作は負の端にラップすることであることに注意してください。

例えば、

long m = long(2147483647);
std::cout << ++m << std::endl;

出力されます:-2147483648

したがって、プログラムが初期化する前に長時間実行されていてstartstartたまたま2147483647(可能な最大long値)に初期化されたとします。

この時点で、clock()2147483647に再び近づいているときに、-2147482649などの値を取得することによって返された値のラップを開始すると思います。したがって、私の元のコードは、ループを完了するのにおそらく非常に長い時間がかかり、意図した遅延よりもはるかに長くなります。

実際の動作ですか?このスタイルの一時停止は、特定の量未満の遅延にのみ使用する必要がありますか?これを「安全」にするために行われるべき他のチェックはありますか?

4

3 に答える 3

3

符号付き整数型をオーバーフローするとどうなるかは実装定義であり、シグナルである可能性があります。はい、これはclock()、プロセスの開始後、一定の時間だけ使用できることを意味します。おそらく、最初の呼び出しが常に 0 を返すことを実装が保証する場合にのみ使用できます (私が知っているすべての実装の場合)。

于 2012-08-13T15:08:10.320 に答える
2

使用: GetTickCount64();
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724411(v=vs.85).aspx

于 2012-08-13T15:28:05.803 に答える
0

が符号付きの型として定義されている場合clock_t、はい、これは予期される動作です。

ラップアラウンドが心配な場合は、常にclock_t値をにキャストできます(つまり、それは a よりも広くないとunsigned long想定しています)、代わりにその値を保存/比較します。clock_tlong

于 2012-08-13T15:06:40.123 に答える