0

バックストーリー:解決しようとしていた時間変換に問題があります。私が取り組んでいるプログラムは、内部日付表現を使用しています。日付は、2000/01/01 からの秒数で表されます。その数はプログラム内で一定です。その数はタイムゾーンに依存する可能性があるため、そうすべきではないと思いました。

2000/01/01 の UNIX エポック開始からの秒数がマシンによって異なるかどうかをテストするための簡単なプログラムを作成しました。

struct tm tm_date;
time_t t_LongDate;

tm_date.tm_year = 2000 - 1900;
tm_date.tm_mon  = 1 - 1;
tm_date.tm_mday = 1;
tm_date.tm_hour = 0;
tm_date.tm_min  = 0;
tm_date.tm_sec  = 0;

t_LongDate = mktime(&tm_date);
printf("result: %lld\n", (long long)t_LongDate);

return 0;

開発マシンでプログラムをコンパイルしたところ、動作しているように見えました。

result: 946681200

次に、バイナリを問題のあるホストにアップロードしました。それは私の仮説を反証しました。秒数は同じでした:

problematic-host# ./a.out 
result: 946681200

私は不審者なので、問題のあるホストでプログラムを再コンパイルしてみました。あまり期待していませんが、次のとおりです。

problematic-host# gcc secSinceEpoch.c 
problematic-host# ./a.out 
result: 946677600

私が最初に予想したように、時間差があります。しかし何が起こった?GCC は私の小さなプログラムを最適化して、ユーザー入力やランダム性のソースに依存していなかったので、定数値を出力するようにしましたか? 私の本当の大きなプログラムでも同じことをしますか? 実際に機能を実行するように強制する方法はありますか?

4

2 に答える 2

4

tm_dateのようにのすべてのフィールドを初期化するわけではないtm_isdstため、一部のフィールドには予測できない値が含まれています。バグを修正すれば、謎は消えます。

于 2013-02-28T03:56:57.197 に答える
4

GCC は私の小さなプログラムを最適化して、ユーザー入力や乱数のソースに依存していなかったので、定数値を出力するようにしましたか?

あるべきときに変数が更新されていないと思われる場合は、最適化をオフにして試すか、変数をvolatile次のように作成します。

例:

int count = 0;    
while(count == 0);

ここで、コンパイラは、ステートメントcountを実行するたびに の値のチェックをオフにして最適化します。whileただし、count変数は他の外部要因によって更新される場合があります。

したがって、この時点でコンパイラに強制的に最適化を無効にするには、be を宣言countしますvolatile

于 2013-02-28T04:05:47.240 に答える