๊ธ€ ์ž‘์„ฑ์ž: ๋˜ฅํด๋ฒ .
๋ฐ˜์‘ํ˜•
์ด ํฌ์ŠคํŠธ๋Š”, ์œค์„ฑ์šฐ ์ €์ž๋‹˜์˜ '๋‡Œ๋ฅผ ์ž๊ทนํ•˜๋Š” ์œˆ๋„์šฐ์ฆˆ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ'์„ ๋ฐ”ํƒ•์œผ๋กœ ์ œ ์ƒ๊ฐ์„ ์žฌ๊ตฌ์„ฑํ•˜์—ฌ ์ •๋ฆฌํ•œ ํฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

 

๋ชฉ์ฐจ


  • 64๋น„ํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • 64๋น„ํŠธ์™€ 32๋น„ํŠธ ๊ณต์กด์˜ ๋ฌธ์ œ์ 
  • Windows ์Šคํƒ€์ผ ์ž๋ฃŒํ˜•

 

64๋น„ํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ


 64๋น„ํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€, 64๋น„ํŠธ ์‹œ์Šคํ…œ์„ ๊ณ ๋ คํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ์ž๋ฃŒํ˜•์— ๋Œ€ํ•ด์„œ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

LLP 64 vs LP64

64๋น„ํŠธ ์‹œ์Šคํ…œ์œผ๋กœ ๊ฐ€๋ฉด ์ž๋ฃŒํ˜•์ด๋ผ๋˜๊ฐ€ ํƒ€์ž…์„ ์žฌ๊ตฌ์„ฑํ•  ํ•„์š” ์žˆ๋‹ค.

์šด์˜์ฒด์ œ ๋ชจ๋ธ char short int long ํฌ์ธํ„ฐ
Windows LLP64 1๋ฐ”์ดํŠธ 2๋ฐ”์ดํŠธ 4๋ฐ”์ดํŠธ 4๋ฐ”์ดํŠธ 8๋ฐ”์ดํŠธ
UNIX LP64 1๋ฐ”์ดํŠธ 2๋ฐ”์ดํŠธ 4๋ฐ”์ดํŠธ 8๋ฐ”์ดํŠธ 8๋ฐ”์ดํŠธ

๊ธฐ์กด 32๋น„ํŠธ ์‹œ์Šคํ…œ๊ณผ ํฐ ์ฐจ์ด๋Š” ํฌ์ธํ„ฐ๋ฐ–์— ์—†๋„ค..?๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋งž๋Š” ์ด์•ผ๊ธฐ๋‹ค.

32๋น„ํŠธ ์‹œ์Šคํ…œ๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊ณ ๋ คํ•ด์„œ ์ž๋ฃŒํ˜•์ด ๋””์ž์ธ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ํฌ์ธํ„ฐ์˜ ํฌ๊ธฐ๋งŒ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

64๋น„ํŠธ์™€ 32๋น„ํŠธ ๊ณต์กด์˜ ๋ฌธ์ œ์ 


๋ฐ์ดํ„ฐ ์†์‹ค์˜ ๋ฌธ์ œ

#include <stdio.h>
int main(void)
{
	int arr[10] = {0,};
	int arrVal = (int)arr; // ๋ฐ์ดํ„ฐ ์†์‹ค์ด ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜
	printf("pointer: %d \n", arrVal);
	return 0;
}

 64๋น„ํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ๋•Œ ์ฃผ์˜ํ•  ์ ์€ ํฌ์ธํ„ฐ๋Š” 4๋ฐ”์ดํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ 8 ๋ฐ”์ด ํŠธ๋ผ๋Š” ์ ์ด๋‹ค.

arr์ด๋ผ๋Š” ๋ฐฐ์—ด ์ด๋ฆ„์€ ํฌ์ธํ„ฐ๊ณ , ๋ฐฐ์—ด์˜ ์ด๋ฆ„๋„ 8๋ฐ”์ดํŠธ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๋œ๋‹ค.

arr์ด๋ผ๋Š” ํฌ์ธํ„ฐ๋ฅผ intํ˜•์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ํ˜• ๋ณ€ํ™˜ํ•˜๋ฉด 8๋ฐ”์ดํŠธ๋ฅผ 4๋ฐ”์ดํŠธ๋กœ ํ˜• ๋ณ€ํ™˜์„ ํ•˜๋‹ˆ๊นŒ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

 

Windows ์Šคํƒ€์ผ ์ž๋ฃŒํ˜•


Polymorphic ์ž๋ฃŒํ˜•

#if defined(_WIN64)
	typedef __int64 LONG_PTR;
	typedef unsigned __int64 ULONG_PTR;
	typedef __int64 INT_PTR;
	typedef unsigned __int64 UINT_PTR;
#else
	typedef long LONG_PTR;
	typedef unsigned long ULONG_PTR;
	typedef int INT_PTR;
	typedef unsigned int UINT_PTR;
#endif

ํ•˜๋‚˜๊ฐ€ ๋‘˜ ์ด์ƒ์˜ ํŠน์„ฑ์„ ์ง€๋‹ˆ๋Š” ๊ฒƒ์„ ๋‹คํ˜•์„ฑ(Polymorphic)์ด๋ผ ํ•œ๋‹ค.

__WIN64๊ฐ€ ์ •์˜๋˜์–ด์žˆ๋‹ค๋ฉด ๊ทธ์— ๋งž๊ฒŒ 64๋น„ํŠธ ํƒ€์ž… ์ž๋ฃŒํ˜•์œผ๋กœ ๋งคํฌ๋กœ ํƒ€์ž…์ด ์ •์˜๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ ์ด๋ฆ„์— PTR์ด๋ผ๊ณ  ๋ถ™์–ด์žˆ์–ด์„œ ํฌ์ธํ„ฐ๋ผ๊ณ  ์ฐฉ๊ฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ํฌ์ธํ„ฐ๊ฐ€ ์•„๋‹ˆ๋‹ค.

ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์„ ์œ„ํ•œ Polymorphic ์ž๋ฃŒํ˜•์ด๋‹ค.

 

[์˜ˆ์ œ 1-1]

UINT CalDistance(UINT a, UINT b)
{
	return a-b;
}

int _tmain(void)
{
	INT val1 = 10;
	INT val2 = 20;
	_tprintf(_T("Position %d, %d \n"), (UINT)&val1, (UINT)&val2);
	_tprintf(_T("Dosition %d \n"), CalDistance((UINT)&val1, (UINT)&val2));
	return 0;
    
}

 ์œ„์˜ ์˜ˆ์ œ๋Š” val1๊ณผ val2์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค. (์ฃผ์†Œ ๊ฐ’์˜ ์ฐจ)

UINT๋Š” 4๋ฐ”์ดํŠธ๋‹ค. 32๋น„ํŠธ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ ์ ˆํžˆ ๊ณ„์‚ฐํ•˜๊ฒ ์ง€๋งŒ 64๋น„ํŠธ ์‹œ์Šคํ…œ์—์„œ๋Š” ๊ณ„์‚ฐ์ด ์ด์ƒํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

 

[์˜ˆ์ œ 1-2]

UINT CalDistance(UINT_PTR a, UINT_PTR b)
{
	return a-b;
}

int _tmain(void)
{
	INT val1 = 10;
	INT val2 = 20;
	_tprintf(_T("Position %d, %d \n"), (UINT_PTR)&val1, (UINT)&val2);
	_tprintf(_T("Dosition %d \n"), CalDistance((UINT)&val1, (UINT_PTR)&val2));
	return 0;
    
}

Polymorphic ์ž๋ฃŒํ˜•์„ ํ†ตํ•ด 64๋น„ํŠธ ์‹œ์Šคํ…œ๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๋งž์ถฐ์ฃผ์—ˆ๋‹ค.

์ด์ œ ์ž๋ฃŒํ˜• ์ด๋ฆ„์— PTR์ด ์™œ ๋ถ™์—ˆ๋Š”์ง€ ๊ฐ์ด ์˜ค๋Š”๊ฐ€..?

์ž๋ฃŒํ˜• ์ž์ฒด๊ฐ€ ํฌ์ธํ„ฐ ํƒ€์ž…์ด ์•„๋‹ˆ๋ผ, ์ฃผ๋กœ ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์„ ๋ชฉ์ ์œผ๋กœ ํ™œ์šฉ๋˜๋Š” ์ž๋ฃŒํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์— _PTR์ด ๋ถ™๋Š” ๊ฒƒ์ด๋‹ค.

 

์˜ค๋ฅ˜์˜ ํ™•์ธ


 ์•ž์˜ ๋‚ด์šฉ๊ณผ ํ๋ฆ„์— ์•ˆ ๋งž๋Š” ๋‚ด์šฉ์ด๊ธด ํ•˜์ง€๋งŒ ์•Œ์•„์•ผ ํ•˜๋Š” ๋‚ด์šฉ์ด๋‹ค.

  • ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์„ฑ๊ณต ์—ฌ๋ถ€ ํ™•์ธ์˜ ๊ธฐ๋ณธ
    • GetLastError ํ•จ์ˆ˜ ํ˜ธ์ถœ
Constant/value Description
ERROR_ARITHMETIC_OVERFLOW = 534 Arithmetic result exceeded 32bits.
ERROR_PIPE_CONNECTED = 535 There is a process on otehr end of pipe.
ERROR_PIPE_LISTENING = 536 Waiting for a process to open the other end of pipe.
ERROR_EA_ACCESS_DENIED = 994 Access to extended attribute was denied.
ERROR_OPERATION_ABORTED = 995 The I/O operation has been aborted because of either a thread exit or an application request.
ERROR_IO_INCOMPLETE = 996 Overlapped I/O event is not in a signaled state.
ERROR_IO_PENDING = 997 Overlapped I/O operation is in progress.
ERROR_NOACCESS = 998 Invalid access to memory location.
ERROR_SWAPERROR = 999 Error performing inpage operation.

Windows ์‹œ์Šคํ…œ์—์„œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋ƒ ํ•˜๋ฉด, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ „์—ญ ๊ณต๊ฐ„์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜์—๋‹ค ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์ด์œ ๋ฅผ ์ €์žฅํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋“ค์€ ์ „์—ญ๊ณต๊ฐ„์— ์ ‘๊ทผํ•ด์„œ ์™œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ, GetLastError๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ „์—ญ๊ณต๊ฐ„์— ์ ‘๊ทผํ•˜์—ฌ ์˜ค๋ฅ˜์˜ ์ด์œ ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์ด ์žˆ๋Š”๋ฐ, GetLastErrorํ•จ์ˆ˜๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ ์ด์œ ๋ฅผ ์•Œ๊ณ  ์‹ถ์€ ํ•จ์ˆ˜ ๋ฐ”๋กœ ์งํ›„ ์จ์•ผ ํ•œ๋‹ค.

์™œ๋ƒํ•˜๋ฉด, ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์—๋Ÿฌ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ๊ฒ€์‚ฌํ•˜๊ณ ์ž ํ•˜๋Š” ์—๋Ÿฌ ๋‚ด์šฉ์„ ๋’ค๋ฎ์–ด ๋ฒ„๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฐ˜์‘ํ˜•