増減演算子prefix、postfix差異


通常、増分/減算演算子を使用する場合、++iの形式がよく使用されます.
そして話題になったのが「++ii++の違い」
結果に差はなかった.両方ともiに1を加えただけです.
でも、もう少し詳しく言えば、
この2つの演算子自体は別々です.
以下に、Microsoftドキュメントで定義した例を示します.
https://docs.microsoft.com/ko-kr/cpp/cpp/increment-and-decrement-operator-overloading-cpp?view=msvc-170
prefix incrementオペレータは、上に++iがあります.
postfix increment operatorはi++です.
// Define prefix increment operator.
Point& Point::operator++()
{
   _x++;
   _y++;
   return *this;
}

// Define postfix increment operator.
Point Point::operator++(int)
{
   Point temp = *this;
   ++*this;
   return temp;
}
prefixを見ると、数字に1を加えるだけでポインタを渡すことができます.
postfixは新しいオブジェクトを作成し、prefixオペレータを呼び出してオブジェクトを渡します.だから一般的には++iが速いと言われています.
ただし、double、intなどの元の変数ではなく、どこでも通常のclassに適用されます.コンパイラはi++の形で++iを処理するからです.
テストしてみます
次のコードは、1億サイズのベクトルを簡単に作成し、文に遍歴します.
1つ目は単純なインデックスで、2つ目はi++で、2つ目は++iです.
3番目/4番目はiteratorを用いて遍歴し、it++++itで区別した.
上記が正しい場合、intで定義されたindexの順序はi++++iと異なるべきではありません.iteratorクラスを使用する場合、it++からコピーする必要があるため、速度が遅くなります.
std::vector<int> test(100000000, 0);
size_t sz = test.size();

std::chrono::high_resolution_clock::time_point tt0 = std::chrono::high_resolution_clock::now();

for(int i=0;i<sz;i++ )
{

}
std::chrono::high_resolution_clock::time_point tt1 = std::chrono::high_resolution_clock::now();

for(int i=0;i<sz;++i )
{

}
std::chrono::high_resolution_clock::time_point tt2 = std::chrono::high_resolution_clock::now();

int cnt =0;
for(auto it=test.begin();it!=test.end();it++ )
{

}

std::chrono::high_resolution_clock::time_point tt3 = std::chrono::high_resolution_clock::now();

cnt =0;
for(auto it=test.begin();it!=test.end();++it)
{

}

std::chrono::high_resolution_clock::time_point tt4 = std::chrono::high_resolution_clock::now();

auto ts0 = std::chrono::duration_cast<std::chrono::milliseconds>(tt1 - tt0).count();
auto ts1 = std::chrono::duration_cast<std::chrono::milliseconds>(tt2 - tt1).count();
auto ts2 = std::chrono::duration_cast<std::chrono::milliseconds>(tt3 - tt2).count();
auto ts3 = std::chrono::duration_cast<std::chrono::milliseconds>(tt4 - tt3).count();

std::cout << ts0 <<"\n";
std::cout << ts1 <<"\n";
std::cout << ts2 <<"\n";
std::cout << ts3 <<"\n";
時間的に見ると
176
179
1347
945
少し違いますが、1つ目と2つ目はほぼ似ています.
逆にiteratorを使うと++itが少し速く見えます.私たちはすべての人が知っている内容をテストしました.
ここで重要なのは,余分な巡回目的のためにベクトル反復器を使用しないことである.