E D R , A S I H C RSS

i++VS++i

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 ๋ฅผ „น˜–ˆ„๋•Œ˜ ปดŒŒผ๋Ÿฌ)




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 œผ๋กœ  „œ„ฆ๊ฐ€(๊ฐ†Œ)™€ ›„œ„ฆ๊ฐ€(๊ฐ†Œ)๋Š” ๋‹คŒ๊ณผ ๊ฐ™ด ๊ตฌ˜„๋˜–ด žˆ๋‹ค.
~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 ˜ ๋ณต‚ฌ๋ฅผ ตœ ™” • ˆ˜ žˆ๋Š” ๊ฐ€๋Šฅ„—„œ๋Š” ๋ณดžฅ•  ˆ˜ —†๋‹ค. ๋”ฐ๋ผ„œ, ๋‹คŒ๊ณผ ๊ฐ™€ ๊ฒฝšฐ
~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 ˜€๋‚˜.. ”„๋กœ๊ทธ๋žจ †๋„๋ฅผ ฆ๊ฐ€‹œ‚ค๋ ค๋ฉด,  œผ ‹œ๊ฐ„„ ๋งŽด žก•„๋จน๋Š” ๋ถ€๋ถ„„ ˆ˜ ••˜๋ผ๊ณ ... ฉ.. ๋งˆดฌ๋กœ ”„๋กœ๊ทธ๋žจด๋‚˜. ๋ฆฌ–ผƒ€ž„ –ด”Œ๋ฆฌผ€ด…˜๊ฐ™€๊ณณ—„œ๋Š” •„𔕠ˆ˜๋„ žˆ๊ฒ ๊ตฐš”.; - ž„ธƒ

7. ++i ฐฌ„

๋™ผ•œ ๊ธฐ๋Šฅ— “ด๋‹ค๋ฉด, ++i — Šต๊ด€„ ๋“คด๋Š” ๊ฒƒ„ ถ”ฒœ•œ๋‹ค. STL๊ฐ™€ —ฐ‚ฐž žฌ •˜ ๋ผด๋ธŒ๋Ÿฌ๋ฆฌ ๋•Œ๋ฌธ --NeoCoin

8. i++ ฐฌ„

i++€ ๊ทธ Šนœ ˜ ๊ธฐ๋Šฅด •„𔕠 ๋•Œ๋งŒ “ฐ๋Š”๊ฒƒด ข‹„๊ฒƒ ๊ฐ™๋‹ค. i++๋ฅผ “ฐ๋ฉด ๋‹คŒ๊ณผ ๊ฐ™ด ๋‘„ด •œ„๋กœ ฃผ๋Š” ๊ฒฝšฐ๊ฐ€ žˆ๊ธฐ ๋•Œ๋ฌธด๋‹ค.

˜„žฌ ž๋ฃŒ๋ฅผ ฐ๊ณ , ๋‹คŒ ž๋ฃŒ๋กœ นดšดŒ…„ •˜๋ ค •œ๋‹ค.

~cpp 
...
cout << data[i] << endl
i += 1;
...
๊ฐ€ ด๋ ‡๊ฒŒ •œ„๋กœ ฃผ๋Š” ›„œ„ —ฐ‚ฐž˜ ๊ธฐ๋Šฅ„ ดšฉ• ๋•Œ “ฐž.

~cpp 
cout << data[i++] << endl;
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:31:42
Processing time 0.0250 sec