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变量可能会被其他外部因素更新。

因此,为了强制编译器此时禁用优化,我们声明countvolatile.

于 2013-02-28T04:05:47.240 回答