std::chrono を使用して for ループにかかる時間をカウントしようとしましたが、バインドされた値をインクリメントしてループを長くしても 0 ナノ秒になります。これはコードです:
#pragma pack(1) // dont align let's let it take longer
struct Foo{
int x;
char c;
int z;
} ;
void take_time()
{
Foo f;
auto t1 = std::chrono::system_clock::now();
register int c = 0;
int x=0,y=0,z=1;
for (c=0;c<10000;c++){ // even if i put 1000000000 it will take 0 nanosec !!!!!
f.z = x+y;
f.z += z-x+y;
}
std::cout<<"\ntoken time : "<< std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now()-t1).count()<<std::endl;;
}
出力:
token time : 0
しかし、ループのカウンターの境界を非常に大きな値に増やすと、突然永遠にかかります!! 、c<100000000 を入力すると 0 ナノ秒かかりますが、右側に「0」を 1 つ追加すると永遠にかかります!!
答え: WhiZTiM が言ったように、コンパイラはループを削除しています。ループは役に立たないからです (gcc <3 に感謝)。 (この特定のものではありません)、そうするために、ループに asm 行を挿入できます。asm("")
、空の asm 、ループ内の任意の場所。これは、最適化できない低レベルの操作がいくつかあることをコンパイラに伝えます。または、ループで使用される任意の変数に voltile キーワードを使用して、コンパイラがその変数に関連する最適化を実行できないようにすることができます。みんなありがとうこれが役立つことを願っています