背景:我有一个时间转换的问题,我试图解决。我正在开发的程序使用内部日期表示。日期表示为自2000/01/01起的秒数。这个数字在程序中是恒定的。我的猜测是,它不应该是,因为这个数字可能取决于时区。
我做了一个简单的程序,测试从unix epoch 2000/01/01开始的秒数在不同的机器上是否不同:

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是否优化了我的小程序,只输出一个常量值,因为它不依赖于任何用户输入或随机源?在我真正的大节目里也会这样吗?有什么方法可以强制它实际运行函数吗?

最佳答案

您没有初始化tm_date的每个字段,例如tm_isdst,因此有些字段具有不可预测的值。把虫子修好,神秘就会消失。

关于c - GCC是否过度优化?自纪元开始以来的秒数不同,具体取决于我在哪里编译,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15127161/

10-11 15:38