Mik*_*Sam -5 c++ time loops reference visual-studio
我试着计算通过循环的操作次数为1秒.为此,我记得我开始计算循环并在每次迭代时检查时间的时间.我的想法 - 当这两个时间段的秒数不同时,我打印了多少次循环迭代.
这是我的代码:
#include <ctime>
int main()
{
// For timing
time_t t, tstep;
struct tm* now, *step;
// this time will change at every iteration
t = time(0);
now = localtime(&t);
// save time of the start moment
tstep = t;
step = localtime(&tstep);
// counter of loop cycles
int count = 0;
for (size_t i = 0; i < 1e100 ; i++)
{
// ... here is some calculations
t = time(0);
now = localtime(&t);
count++;
if (now->tm_sec != step->tm_sec)
{
tstep = time(0);
step = localtime(&tstep);
//printf("number of lines %i \n", count );
count = 0;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是什么:每次刷新都now step变成了同样的价值!虽然t和tstep不同!
看起来这是因为引用:也许当我使用tstep = t这个意味着这个变量的地址引用t两者.所以t变化now和变化tstep.
如何解决这个问题呢?如何复制的正义价值t来step?还是有另一种实际的方式?
该localtime函数不是线程安全的,更重要的是不可重入.
它返回的指针很可能是指向内部static缓冲区的指针.这意味着每次localtime调用都会返回指向同一"缓冲区"(结构)的指针.实际上,如果您读取链接引用,则可以在多个函数之间共享缓冲区(结构).
这可以通过使用调试器轻松检查,并比较函数返回的指针.
如果需要不同的值,则需要复制数据而不是复制指针.这可以通过制作now和step构造实例而不是指针来完成.然后取消引用返回的指针localtime:
struct tm now, step; // Note: Not pointers!
...
now = *localtime(&t); // Dereference returned pointer
Run Code Online (Sandbox Code Playgroud)