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.0715 sec