- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这code example在 Release模式下使用 Visual Studio Professional 2013 Update 3 编译时,无论 N
的值如何,都将输出 time: 0
,32 位和 64 位选项:
#include <iostream>
#include <functional>
#include <ctime>
using namespace std;
void bar(int i, int& x, int& y) {x = i%13; y = i%23;}
int g(int N = 1E9) {
int x, y;
int r = 0;
for (int i = 1; i <= N; ++i) {
bar(i, x, y);
r += x+y;
}
return r;
}
int main()
{
auto t0 = clock();
auto r = g();
auto t1 = clock();
cout << r << " time: " << t1-t0 << endl;
return 0;
}
在 rextester.com 上使用 gcc、clang 和其他版本的 vc++ 进行测试时,它的行为正确并输出大于零的 time
。有什么线索吗?
我注意到内联 g()
函数可以恢复正确的行为,但会更改 t0
、r
和 的声明和初始化顺序>t1
没有。
最佳答案
如果您使用调试器查看反汇编窗口,您可以看到生成的代码。对于处于 Release模式的 VS2012 Express,您会得到:
00AF1310 push edi
auto t0 = clock();
00AF1311 call dword ptr ds:[0AF30E0h]
00AF1317 mov edi,eax
auto r = g();
auto t1 = clock();
00AF1319 call dword ptr ds:[0AF30E0h]
cout << r << " time: " << t1-t0 << endl;
00AF131F push dword ptr ds:[0AF3040h]
00AF1325 sub eax,edi
00AF1327 push eax
00AF1328 call g (0AF1270h)
00AF132D mov ecx,dword ptr ds:[0AF3058h]
00AF1333 push eax
00AF1334 call dword ptr ds:[0AF3030h]
00AF133A mov ecx,eax
00AF133C call std::operator<<<std::char_traits<char> > (0AF17F0h)
00AF1341 mov ecx,eax
00AF1343 call dword ptr ds:[0AF302Ch]
00AF1349 mov ecx,eax
00AF134B call dword ptr ds:[0AF3034h]
从汇编的前 4 行可以看出,对 clock
(ds:[0AF30E0h]
) 的两次调用发生在对 g< 的调用之前
。所以在这种情况下,g
花费多长时间并不重要,结果只会显示这两个顺序调用之间的时间。
似乎 VS 已经确定 g
没有任何会影响 clock
的副作用,因此可以安全地移动调用。
正如 Michael Petch 在评论中指出的那样,将 volatile
添加到 r
的声明中将阻止编译器移动调用。
关于c++ - 你能用 ctime 重现或解释这个 Visual C++ 错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26189166/
我对 glibc ctime() 的工作原理有疑问。 按照我的代码片段: #include #include #include int main (int argc,char*
当我使用“ctime”时,curTime 和 pastTime 得到相同的字符串结果,即使 curTime 和 pastTime 的实际值相差 600 秒。 使用 ctime 时如何为两者获得相同的字
我有这个unix时间戳,使用ctime转换后显示为Thu Mar 26 15:30:26 2007,但我只需要Thu Mar 26 2007。 如何更改或截断以消除时间 (HH:MM:SS)? 最佳答
我在文本文件中插入时间时遇到问题。我使用以下代码得到 |21,43,1,3,10,5| Wed Feb 01 20:42:32 2012 这是正常的,但我想做的是将时间放在数字之前,例如 Wed Fe
我已将 ctime 值转换为 unicode 1295478503.6789999到'2011 年 1 月 19 日星期三 18:08:23' 我可以倒退吗?从第二行到第一行? 最佳答案 您需要 Py
ctime()函数应该给出自 Epoch 以来传入的秒数的字符串格式时间。这是我的代码: #include #include #include int main(int argc, int **arg
#include #include #include using namespace std; #define WIDTH 118 #define HEIGHT 60 void clearScr
我在将 ctime 字符串转换为 %Y-%m-%d 格式时遇到问题。 fileobject = "C:\\foo\\bar.txt" filetime = time.ctime(os.path.get
你好, 我有以下代码: int main () { time_t rawtime; time ( &rawtime ); printf ( "The current local time
我正在尝试更改我的 unix 时间戳的格式。但我没有看到任何自定义格式的选项。 这是我的代码: tempstring = "Your last login was: "; time_t lastLog
我正在使用 ctime。但是它总是返回 NULL。所以它以 sprintf 行为核心。它工作得更早。所以不确定为什么会随机返回 NULL? 我有以下代码片段: int main() { cha
如果用户类型time_t定义为__darwin_time_t,在MacOS X中它本身定义为long,为什么会出现下面的代码输出8 时间是(null)?也许这很愚蠢,但我真的无法理解。 #includ
我正在使用 ctime。但是它总是返回空值。所以它以 sprintf 线为核心。它工作得更早。所以不确定为什么它会随机返回 null。 我有以下代码片段: int main() { char avp
这是代码: void i_log_ (int error, const char * file, int line, const char * fmt, ...) { /* Get erro
标准 C ctime 函数是否返回公历日期?特别是,我想验证它是否会考虑闰年,从而显示相应日期的 Feb 29。 最佳答案 对于 future 和最近的时间,是的。对于公历改革之前的时间...我不知道
我有这样一个函数: void ft_display_time(struct timespec ttime) { char *time_long; time_long = cti
我试图让一个循环在 executionTime 指定的准确时间执行。我正在使用 ctime 来获得这个时间,我需要它在几毫秒的精度内(我相信它是)。一旦该循环运行了指定的执行时间,它就会中断。 我的问
我正在寻找 的 C++11 版本图书馆。 C++11 中有这样的东西吗? 编辑:任何具有更多功能的东西都是完美的! 编辑 2:我希望将其与我正在制作的游戏一起使用,以便我可以跟踪玩的总时间。我正在寻
我正在使用 ctime函数来获取 time_t 变量的可读表示。 ctime声明如下: char *ctime (const time_t *timer); 你可以看到它返回了一个指向结果 char
linux下的find命令在目录结构中搜索文件,并执行指定的操作。linux下的find命令提供了相当多的查找条件,功能很强大,由于find的功能很强大,所以他的选项也很多,今天我们来细说一下fin
我是一名优秀的程序员,十分优秀!