増減演算子prefix、postfix差異
通常、増分/減算演算子を使用する場合、
そして話題になったのが「
結果に差はなかった.両方とも
でも、もう少し詳しく言えば、
この2つの演算子自体は別々です.
以下に、Microsoftドキュメントで定義した例を示します.
https://docs.microsoft.com/ko-kr/cpp/cpp/increment-and-decrement-operator-overloading-cpp?view=msvc-170
prefix incrementオペレータは、上に
postfix increment operatorは
postfixは新しいオブジェクトを作成し、prefixオペレータを呼び出してオブジェクトを渡します.だから一般的には
ただし、double、intなどの元の変数ではなく、どこでも通常のclassに適用されます.コンパイラは
テストしてみます
次のコードは、1億サイズのベクトルを簡単に作成し、文に遍歴します.
1つ目は単純なインデックスで、2つ目は
3番目/4番目はiteratorを用いて遍歴し、
上記が正しい場合、intで定義されたindexの順序は
176
179
1347
945
少し違いますが、1つ目と2つ目はほぼ似ています.
逆にiteratorを使うと
ここで重要なのは,余分な巡回目的のためにベクトル反復器を使用しないことである.
++i
の形式がよく使用されます.そして話題になったのが「
++i
とi++
の違い」結果に差はなかった.両方とも
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
が少し速く見えます.私たちはすべての人が知っている内容をテストしました.ここで重要なのは,余分な巡回目的のためにベクトル反復器を使用しないことである.
Reference
この問題について(増減演算子prefix、postfix差異), 我々は、より多くの情報をここで見つけました https://velog.io/@mir21c/증감-연산자-prefix-postfix-차이テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol