C/C++ ์์ ++i ์ i++ ์ ์ฑ๋ฅ ์ฐจ์ด์ ๋ํ ๋น๊ต
- ์ฌ์ฉํ ์ปดํ์ผ๋ฌ : Microsoft 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86 (Microsoft Visual C++ 6.0 ์ Service Pack 5 ๋ฅผ ์ค์นํ์๋์ ์ปดํ์ผ๋ฌ)
Contents
1. ๊ทธ๋ฅ ์ฌ์ฉ ¶
- ๋น๊ตํ C/C++ ์์ค
~cpp #include <stdio.h> void main() { int i; scanf("%d", &i); ++i; printf("%d", i); }
~cpp #include <stdio.h> void main() { int i; scanf("%d", &i); i++; // ์ด๋ ๊ฒ ํ๋ฉด ์ฐจ์ด๊ฐ ๋น์ฐํ ์์ง ์์๊น์? ์ด๋ด๋๋ ์ ํ์ด๋ ํํ์ด๋ ์ฆ๊ฐํ๋ค์ printf์์ ๊ทธ ๋ณ์๋ฅผ ์ฌ์ฉํ์ผ๋.. printf("%d", i); // ๋ฌธ์ ๊ฐ ๋๋๊ฑด ํจ์(i++)๋๋ ํจ์(++i)์ด๋ฐ๋ฐ์์ ๋ฌธ์ ๊ฐ ์๊ธธ๊ฑฐ ๊ฐ์๋ฐ.. }
๊ฐ๋จํ ์๊ฐํ๋ฉด ๋๋ ๊ฒ์ด์์ต๋๋ค.. i++ ์ด๋ ++i ๋ชจ๋ ๊ฐ(value)์ ์์ฑํ๋ ์ฐ์ฐ์ ์
๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก.. i ๊ฐ 5 ์ผ๋ i++ ์ ๊ฐ์ 5์ด๋ฏ๋ก.. printf("%d", i) ๋ 5๋ฅผ ์ฐ์ด์ฃผ๊ฒ ์ง์.
1.1. ์ต์ ํํ์ง ์์๋ ¶
- ++i ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp mov ecx, DWORD PTR _i$[ebp] ; ๋ณ์ i ์ธ _i$[ebp] ๋ฅผ ecx ๋ก ์ฎ๊ธฐ๊ณ add ecx, 1 ; ecx ์ 1 ์ ๋ํ๊ณ mov DWORD PTR _i$[ebp], ecx ; ecx ๋ฅผ ๋ค์ _i$[ebp] ๋ก
- i++ ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp mov ecx, DWORD PTR _i$[ebp] ; ์ฐจ์ด ์์ add ecx, 1 mov DWORD PTR _i$[ebp], ecx
1.2. ํฌ๊ธฐ ์ต์ ํ ¶
- ++i ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp inc DWORD PTR _i$[ebp] ; ๋ณ์ i ์ธ _i$[ebp] ๋ฅผ 1 ๋งํผ ์ฆ๊ฐ์ํด
- i++ ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp inc DWORD PTR _i$[ebp] ; ์ฐจ์ด ์์
1.3. ์๋ ์ต์ ํ ¶
- ++i ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp mov eax, DWORD PTR _i$[esp+12] ; ๋ณ์ i ์ธ _i$[esp+12] ๋ฅผ eax ๋ก ์ฎ๊ธฐ๊ณ inc eax ; eax ๋ฅผ 1 ๋งํผ ์ฆ๊ฐ์ํด
- i++ ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp mov eax, DWORD PTR _i$[esp+12] ; ์ฐจ์ด ์์ inc eax
2. for ๋ฌธ์์ ์ฌ์ฉ ¶
- ๋น๊ตํ C/C++ ์์ค
~cpp #include <stdio.h> void main() { for(int i = 0 ; i < 10 ; ++i) printf("%d", i); }
~cpp #include <stdio.h> void main() { for(int i = 0 ; i < 10 ; i++) printf("%d", i); }
2.1. ์ต์ ํํ์ง ์์๋ ¶
- ++i ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp mov eax, DWORD PTR _i$[ebp] ; ๋ณ์ i ์ธ _i$[ebp] ๋ฅผ eax ๋ก ์ฎ๊ธฐ๊ณ add eax, 1 ; eax ์ 1 ์ ๋ํ๊ณ mov DWORD PTR _i$[ebp], eax ; eax ๋ฅผ ๋ค์ _i$[ebp] ๋ก
- i++ ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp mov eax, DWORD PTR _i$[ebp] ; ์ฐจ์ด ์์ add eax, 1 mov DWORD PTR _i$[ebp], eax
2.2. ํฌ๊ธฐ ์ต์ ํ ¶
- ++i ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp inc esi ; ๋ณ์ i ์ธ esi ๋ฅผ 1 ๋งํผ ์ฆ๊ฐ์ํด
- i++ ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp inc esi ; ์ฐจ์ด ์์
2.3. ์๋ ์ต์ ํ ¶
- ++i ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp inc esi ; ๋ณ์ i ์ธ esi ๋ฅผ 1 ๋งํผ ์ฆ๊ฐ์ํด
- i++ ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp inc esi ; ์ฐจ์ด ์์
3. ํจ์ ์์ ์ฌ์ฉ ¶
- ๋น๊ตํ C/C++ ์์ค
~cpp #include <stdio.h> void main() { int i; scanf("%d", &i); printf("%d", ++i); }
~cpp #include <stdio.h> void main() { int i; scanf("%d", &i); printf("%d", i++); }
3.1. No ์ต์ ํ ¶
- ++i ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp mov ecx, DWORD PTR _i$[ebp] add ecx, 1 mov DWORD PTR _i$[ebp], ecx mov edx, DWORD PTR _i$[ebp] push edx push OFFSET FLAT:$SG528 call _printf
- i++ ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp mov ecx, DWORD PTR _i$[ebp] mov DWORD PTR -8+[ebp], ecx mov edx, DWORD PTR -8+[ebp] push edx push OFFSET FLAT:$SG528 mov eax, DWORD PTR _i$[ebp] add eax, 1 mov DWORD PTR _i$[ebp], eax call _printf
3.2. ํฌ๊ธฐ ์ต์ ํ ¶
- ++i ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp inc DWORD PTR _i$[ebp] push DWORD PTR _i$[ebp] push esi call _printf
- i++ ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp mov eax, DWORD PTR _i$[ebp] inc DWORD PTR _i$[ebp] push eax push esi call _printf
3.3. ์๋ ์ต์ ํ ¶
- ++i ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp mov eax, DWORD PTR _i$[esp+12] inc eax push eax push OFFSET FLAT:??_C@_02MECO@?$CFd?$AA@ mov DWORD PTR _i$[esp+20], eax call _printf
- i++ ์ ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ ์์ค
~cpp mov eax, DWORD PTR _i$[esp+12] mov ecx, eax inc eax push ecx push OFFSET FLAT:??_C@_02MECO@?$CFd?$AA@ mov DWORD PTR _i$[esp+20], eax call _printf
4. ์ฐ์ฐ์ ์ฌ์ ์๋ก ๊ตฌํํ์๋ ¶
class ์์ operator overloading ์ผ๋ก ์ ์์ฆ๊ฐ(๊ฐ์)์ ํ์์ฆ๊ฐ(๊ฐ์)๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ๋์ด ์๋ค.
- from MoreEffectiveC++
~cpp MyInteger& MyInteger::operator++() // ์ ์์ฆ๊ฐ { *this += 1; return *this; } const MyInteger MyInteger::operator++(int) // ํ์์ฆ๊ฐ. ์ ๋ฌ์ธ์๋ก int ๊ฐ ์์ง๋ง // ์ปดํ์ผ๋ฌ๋ ๋ด๋ถ์ ์ผ๋ก operator++(0)์ ํธ์ถํ๋ค. { const MyInteger oldValue = *this; ++(*this); return oldValue; }์ฐ์ฐ์ ์ฌ์ ์๋ฅผ ํ์ฌ ํน์ ๊ฐ์ฒด์ ๋ํด ์ ์์ฆ๊ฐ์ ํ์์ฆ๊ฐ๋ฅผ ์ฌ์ฉํ ๋์๋ ์ ์์ฆ๊ฐ๊ฐ ํ์์ฆ๊ฐ๋ณด๋ค ํจ์จ์ด ์ข๋ค. operator++(int) ํจ์์์๋ ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ถ๋ถ์ด ์๋ค.
- from MoreEffectiveC++
4.1. STL ์์ ¶
++i, ๋ i++ ๋๋ค ์๊ด ์๋ ์ํฉ์ด๋ผ๋ฉด, ++i์ ์ต๊ด์ ๋ค์ด์, ์์ ์ฐ์ฐ์ ์ฌ์ ์๋ STL์ ์ฌ์ฉํ๋ค๋ฉด ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ด๋ค. ํ์ ์ฐ์ฐ์๊ฐ ๊ตฌํ๋ Iterator๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค. ์ปดํ์ผ๋ฌ๋จ์์ Iterator ์ ๋ณต์ฌ๋ฅผ ์ต์ ํ ํ ์ ์๋ ๊ฐ๋ฅ์ฑ์์๋ ๋ณด์ฅํ ์ ์๋ค. ๋ฐ๋ผ์, ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ
--NeoCoin
~cpp static const int MAX = 5; int array[5] = {1,2,3,4,5} vector<int> intArray(&array[0], &array[MAX]); for(vector<int>::iterator i = intArray.begin(); i != intArray.end(); ++i){ cout << *i << endl; }๊ฐ ๊ฐ์ฒด ๋ณต์ฌ๋ฅผ ํ์ง ์๋๋ค. ๊ฐ์ฒด๊ฐ ํฌ๋ค๋ฉด ์ด ๋น์ฉ์ ๋ฌด์ํ ์ ์๋ค. ๋ ๊ถ๊ธํ๋ฉด, STL ์์ค๋ฅผ ๋ถ์ํด ๋ณด์.
--NeoCoin
5. ๊ฒฐ๋ก ¶
๊ทธ๋ฅ ์ฌ์ฉํ ๊ฒฝ์ฐ๋, for ๋ฌธ์์ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ ++i ์ i++ ์ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ์๋ค. ๊ทธ๋ฌ๋ ํจ์์ ์ ๋ฌ์ธ์๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ๋ ++i ๋ณด๋ค i++ ์ ์ฝ๋๊ฐ ๋ช
๋ น์ด ํ๊ฐ ์ ๋ ๊ธธ์ด์ง๋ค. ํ์ง๋ง ๊ทธ๋ฅ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ for ๋ฌธ์์ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ i++ ์ ์ด ๊ณณ์ ++i ๋ก ์๋ก ๋ฐ๊ฟ ์จ๋ ์๊ด ์์ผ๋, ํจ์์ ์ ๋ฌ์ธ์๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ i++ ์ ์ด ๊ณณ์ ++i ๋ก ๋ฐ๊พธ๋ฉด ์คํ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํจ์์์ i++ ์ ์ฌ์ฉํ๊ณ ์์ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ด ํ ์ค ์ด๋ผ๋ ์ถ๊ฐ๋์ง ์๊ณ ++i ๋ก ๋ฐ๊ฟ์ ์์ผ๋ฉด ๋ฐ๊พธ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ด๋ค. ๋ํ ๊ทธ๋ฅ ์ฌ์ฉํ ๊ฒฝ์ฐ๋, for ๋ฌธ์์ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ ++i ๋ฅผ ์ฐ์ง ์์๋ ์๊ด ์๋ค. --์๊ท
6. ํ ๋ก ¶
- ์์
... ์ด์
์ด๋ค. ์ ๋ด๋ ๋ชจ๋ฅด๊ฒ ์ผ๋ ๊ฑ ์ ๊ฐ ๋ณธ ๊ธ๊ท๋ฅผ ๊ทธ๋๋ก ์ธ์ฉํ๊ฒ ์ต๋๋ค.
~cpp ์ฌ๊ธฐ์์ ๊ต๊ณผ์์ ์ธ ์ด์ผ๊ธฐ๋ฅผ ํ๋ ํ๊ณ ๋์ด๊ฐ์ผ ํ ๊ฒ ๊ฐ๋ค. ๋ฃจํ ์์์ ํญ์ ์ ํ ์ฆ๊ฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ์ด์ ๋ ๋ฌด์์ผ๊น? ํจ์จ์ฑ ๋๋ฌธ์ด๋ผ๋ ๊ฒ์ด ์ ๋ต์ด๋ค. ํํ ์ฆ๊ฐ ์ฐ์ฐ์๋ ๋ณ์์ ์ด์ ๊ฐ์ ๋๋ ค ์ฃผ๋ฏ๋ก ์ด์ ๊ฐ์ ๋ด์ ์์์ ์ธ ๋ณ์๋ฅผ ๋ง๋ค๊ณ ํ๊ดดํ๋ ๊ณผ์ ์ด ์ผ์ด๋๊ฒ ๋๋ค. ํํ ์ฆ๊ฐ๋ก๋ ์ ํ ์ฆ๊ฐ์ ๋์ผํ ๋ฐฉ์์ ๋ฃจํ๋ฅผ ๋ง๋๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง๋ง, ํํ ์ฆ๊ฐ๋ฅผ ์ฌ์ฉํ ํน๋ณํ ์ด์ ๊ฐ ์๋ค๋ฉด ํญ์ ์ ํ ์ฆ๊ฐ ๋๋ ์ ํ ๊ฐ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
์์ฆ ์ปดํ์ผ๋ฌ๋ค์ ์ต์ ํ๊ฐ ์ ๋์ด์ ์ด์ ๊ฐ์ ๋๋ ค์ฃผ๊ธฐ์ํด ์ด์ ๊ฐ์ ๋ด์ ์์ ๋ณ์๋ฅผ ๋ง๋ค๊ณ ๊ฐ์ ์ฆ๊ฐ์ํจ ํ ์์ ๋ณ์์ ์๋ ์ด์ ๊ฐ์ ๋๋ ค์ฃผ๊ณ ์์ ๋ณ์๋ฅผ ํ๊ดดํ๋ ๋ฐฉ์์ผ๋ก ํ์ง ์๊ณ , ์ด์ ๊ฐ์ ๋จผ์ ๋๋ ค์ฃผ๊ณ ๊ฐ์ ์ฆ๊ฐ์ํต๋๋ค.
์๋๊ฐ ์์ฃผ ๋นจ๋ผ์ผ ํ๋ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋๋ ํน์ ์ปดํ์ผ๋ฌ์์ ์ด๋ป๊ฒ ํ ๋๊ฐ ์ฑ๋ฅ์ด ๋ ์ข์์ง ์ ํ์๊ฐ ์์์๋ ์๋ค.๋ฌผ๋ก ํน์ ์ปดํ์ผ๋ฌ๋ผ๋ ๊ฒ์ด ์ธ์ ๋ ๋ช
์๋์ด์ผ ํ๋ค. ์ผ๋ฐํ๋ ์ผ๋ฐ์ ์ผ๋ก ์ณ์ง ์๋ค.
์ฉ.. ์ ๋ ๋ณ๋ก ์ ๊ฒฝ์ฐ์ง ์๋๋ฐ์... (๋ฌด๊ฐ๊ฐํ๋ค๋;;;) Amdahl's Law ์๋.. ํ๋ก๊ทธ๋จ ์๋๋ฅผ ์ฆ๊ฐ์ํค๋ ค๋ฉด, ์ ์ผ ์๊ฐ์ ๋ง์ด ์ก์๋จน๋ ๋ถ๋ถ์ ์์ ํ๋ผ๊ณ ... ์ฉ.. ๋ง์ดํฌ๋ก ํ๋ก๊ทธ๋จ์ด๋. ๋ฆฌ์ผํ์ ์ดํ๋ฆฌ์ผ์ด์
๊ฐ์๊ณณ์์๋ ํ์ํ ์๋ ์๊ฒ ๊ตฐ์.; - ์์ธํ
8. i++ ์ฐฌ์ฑ ¶
i++์ ๊ทธ ํน์ ์ ๊ธฐ๋ฅ์ด ํ์ํ ๋๋ง ์ฐ๋๊ฒ์ด ์ข์๊ฒ ๊ฐ๋ค. i++๋ฅผ ์ฐ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋์ค์ด ํ์ค๋ก ์ฃผ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ฌ ์๋ฃ๋ฅผ ์ฐ๊ณ , ๋ค์ ์๋ฃ๋ก ์นด์ดํ
์ ํ๋ ค ํ๋ค.
๊ฐ ์ด๋ ๊ฒ ํ์ค๋ก ์ฃผ๋ ํ์ ์ฐ์ฐ์์ ๊ธฐ๋ฅ์ ์ด์ฉํ ๋ ์ฐ์.
~cpp ... cout << data[i] << endl i += 1; ...
~cpp cout << data[i++] << endl;
9. ์ฐธ๊ณ ์๋ฃ ¶
~cpp han.comp.lang.c
์ ์ฌ๋ผ์จ ๊ธ๋ค.http://groups.google.co.kr/groups?selm=3DB97B90.82FF374B@bawi.org
http://groups.google.co.kr/groups?selm=Uqfu9.383$5o4.19586@news.hananet.net
http://groups.google.co.kr/groups?selm=Uqfu9.383$5o4.19586@news.hananet.net