포인터가 4바이트인 이유는?

taeyeung의 이미지

32비트 운영체제에서 포인터는 4바이트로 알고 있고 당연하다고

생각하고 사용을 해 왔는데 어느날 아는 후배가 왜 포인터의 크가가

4바이트이냐고 물어 보니 이유를 답변하기가 애매해졌습니다.

제가 아는 이유는 CPU의 버스가 32비트로 처리되기 때문이라고 알고

있는데 다른 이유가 있는 건가요?

댓글

semmal의 이미지

글쓴이는 질문에 포인터라고 했지 C언어라고 한적은 없습니다.

포인터 쓰는 언어가 C 뿐인가요? ㅎㅎ
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

김일영의 이미지

그러한 주장은 결국 C를 포함한 모든 언어에서 포인터가 4바이트뿐이라는 주장이 되므로, 자승자박이 될 뿐입니다.
ㅋㅋ

semmal의 이미지

뭐 그렇다구요.
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

appler의 이미지


모르겠네요..

이 만큼의 댓글이 달리면 [완료] 달아주는 센스도 필요한데..

위에 저 많은 분들이 얘기해주신거에 대한 감사도 없고..ㅋㅋ

아쉽네여..

4바이트면 32비트고 지금 사용하는 시스템이 32bit니깐

그 어떤 공간으로도 접근을 용이 하게 한다.

이런거 아닌가요??ㅎㅎ..;;

________________________________

궁금증으로 가득찬 20후반 -_-;;
탄생은 죽음의 시작에 불과하다.

블로그
http://azdream.egloos.com
http://koreaappler.blogspot.com

검색엔진
http://applersearchengine.topicle.com/


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.

Darkcircle의 이미지

가상주소를 취급하는 어드레스 버스의 크기가 32비트 이기 때문에 4바이트다...
라고 보시는게 더 맞다고 봅니다... 그래서 메모리상에 저장되는
메모리 가상주소의 길이가 32비트라 4바이트가 되는거죠.
음... 좀 말이 이상하게 들릴지도 모르겠지만 프로세서 아키텍처 쪽 배워보셨다면
제말이 반은 틀리고 반은 맞았다 라고 알아채실 수 있으실 것입니다.

덧 1 : 뭔가 말이 빠졌죠? 알아서 낑궈 맞춰보세요. 그러면 이 답이 제대로 완성됩니다.

덧 2 : 8051이나 AVR 같은 경우 사실 8비트 아키텍처이기 때문에 원래대로라면
어드레스 버스 폭이 8비트밖에 안돼서 실제로 사용할 수 있는 메모리는 1K 정도 밖에 안됩니다.
그런데 아키텍처 내부에 더블 어드레스 포인터를 내장시켜서 어드레스 버스 폭을 16비트로 확장시켰고
그래서 최대 사용가능 메모리 영역을 64K 까지 확장했죠.
뭐... 병렬 시스템 구조로 MCU를 두개이상 배치한다면 실제로 활용할 수 있는 메모리 크기가 늘어나겠지만요 :)

불과 얼마전까지만 해도 주 메모리의 크기가 4GB 정도면 대단하다고 생각했었는데
이젠 아니죠. 포인터가 4바이트 크기가 되면 주 메모리가 아무리 크다 하더라도
사실 4GB도 채 안되는 용량밖에 쓸 수 없습니다.
만약 그 위를 쓰려면 일단 하드웨어적으로 전체적인 재설계가 이루어져야하고
소프트웨어적으론 메모리 사용을 관장하는 커널단에서 꼼수를 부려야겠죠.
그리고 프로그래머가 이를 쓸 수 있으려면 컴파일러에서 알아서 잘 해야겠고요.
지금은 64비트 CPU라면 주메모리가 4GB 넘어가도 잘 돌아가죠? ㅋㅋ

---------------------------------------------------------------
피곤함 1테라톤을 가방 보따리에 주섬주섬 짊어메고 다니는 아이 . . . Orz

---------------------------------------------------------------
폐인이 되자 (/ㅂ/)

swear013의 이미지

제가 알기로 "포인터"라는 개념을 설명하는데 굳이 하드웨어 스펙을 나열할 필요는 없어 보이네요.

포인터라는 말은 일반적으로 C나 C++등의 언어에서나 쓰이는 용어이고, 그것도 자료형에 속하는 녀석입니다.

냉정하게 따지자면 int니 float이니 하는 자료형은 실제 하드웨어적인 측면에서는 아무런 의미도 가지지 못하는 개념입니다. 다만 컴파일러가 해당 자료형을 하부 구조와 통신할 수 있도록 적절하게 변경하는 것이지요. 그래서 int 자료형을 WORD로 동일시 취급하지만 사실 그것은 컴파일러 구현자가 정의하기 나름입니다.

포인터도 마찬가지 입니다. 사용하기 편하기 때문에 해당 크기를 맞춘 것뿐이지 시스템에 종속적인 것이 아닙니다. 위에도 링크가 걸려져 있지만 32비트 머신에서도 포인터 크기가 4byte가 아닌 것이 많습니다.

예를 들어 C++의 클래스 멤버 함수의 함수 포인터 크기를 sizeof로 확인해보시면 압니다.

참고 자료로는

http://blog.naver.com/drvoss.do?Redirect=Log&logNo=20041594354

혼동이 되는 부분은 왜 int 등과 같은 자료형은 항상 동일한 크기를 가지는데 ( 동일한 시스템, 동일한 컴파일러에서요 ) 왜 포인터는 그 쓰임에 따라 크기가 달라질까하는 하는 것입니다.

그러나 이것은 포인터의 개념을 약간 착각한 것이고요. * 표시가 붙는다고 해서 모두 동일한 자료형은 아니라는 것입니다. 즉, int* 와 double* 는 전혀 다른 자료형이 되고 모두 다 크기가 달라도 된다는 것입니다. 다만 이런 집합 군들을 "포인터"라는 이름을 붙인 것일 뿐이지요.

컴파일러 개발사마다 혼동을 피하기 위해 어느정도 이를 조율할 수는 있겠지만 모든 컴파일러가 동일할 것이라고 생각하는 것은 위험하겠습니다.

-----------------------------------------------------------------
어제만난 슈팅스타.

어제만난 슈팅스타.

semmal의 이미지

포인터 쓰는 언어만 해도 제가 아는 것만 대여섯개 됩니다만, 포인터를 설명하면서 하드웨어 스펙을 언급안해도 된다는 말을 듣게 되는 군요.

x86 니모닉 보면서 머리 싸메던게 어제같은데 말이죠.
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

swear013의 이미지

아. 제가 이야기하고자 했던 것은 프로그램 개발시 포인터의 물리적 크기를 고려할 필요가 없다는 것은 아닙니다. 특정 머신에서 로우 레벨의 프로그래밍 시에는 반드시 필요한 부분이기도 하지요.

다만 언어적 측면에서 본다면 "포인터"라는 개념을 opcode상에서 사용되는 메모리 주소 연산과 동일시할 필요는 없다는 것입니다.

--------------------------------------------------------------------------
어제만난 슈팅스타.

어제만난 슈팅스타.

죠커의 이미지

C 언어 문법을 진지하게 다루는 책들은 포인터를 이야기하면서 하드웨어 이야기를 꺼내지 않습니다. H&S등을 참고해보십시요.

silasoni의 이미지

2바이트면 64M밖에 처리못하니까

koseph의 이미지

위에서 이미 언급하셨네요.

결국 포인터의 크기는 시스템 아키텍쳐와 불가분의 관계처럼 보이지만(효율상 관련이 깊으므로)

gcc의 경우 포인터 사이즈는 컴파일러를 컴파일할 때 강제로 키울 수도 있습니다.

아마 다른 상용 컴파일러도 마찬가지일 듯.....

IA32같은 경우 32비트 크기로 포인터를 다루는 것이 가장 효율적이라고 혹은 충분할 거라고 생각하고 그렇게 정한 게 아닌가 싶습니다.

32/64비트 혼합모드로 돌아가는 운영체제는 32비트용 시스템 라이브러리가 별도로 존재하죠. 단지 포인터 크기의 차이뿐만이 아닌 호환성을 유지하기 위해서 어쩔 수 없이 wrapping 할 수 밖에 없죠. 이 경우 응용프로그램 입장에서는 포인터의 크기는 애초에 32비트 환경에서 사용했던기본 크기가 될 것이지만 라이브러리 내에서 결국 네이티브 아키텍처에 맞도록 변환이 이루어진 후에 실행 합니다.

이렇게 보면 동일한 아키텍처 하에서도 컴파일러에 어떤 인자를 넘겨 컴파일 했는가 그리고 어떤 라이브러리를 링크를 걸었는가에 따라 포인터의 크기는 달라집니다.

결론은 포인터의 크기가 꼭 4바이트이다는 것은 진실은 아니죠.

포인터가 4바이트 환경에서 많이들 작업을 하시기 때문에 나온 이야기 같네요.

결론은 포인터의 크기는 컴파일러의 정책에 따라 달라질 수 있다는 것입니다.

There's always another way, dear.

---------------------------------
There's always another way, dear.

wooix의 이미지

분위기 정말 훈훈하니 좋네요..

평온하다~

magingax의 이미지

머신마다 달라요..
OS 에 따라도 달라지고..

LISP 사용자모임
http://cafe.naver.com/lisper
방송기술 개발업체
http://playhouseinc.co.kr

khs0106의 이미지

포인터가 몇바이트인지가 중요한 건가요??

그리고 댓글이 너무 많아서 다 보기도 힘드네요..

추천같은거 있었으면 좋겠는데...

bug74의 이미지

동일한 장비에서도 32bit 로 컴파일을 하면 포인터의 크기는 4byte지만 64bit로 컴파일을 하면 포인터의 크기는 8byte 가 됩니다.
semmal 님의 말씀 처럼 OS나 CPU의 종류에 따라 변하는 것이 아니라 컴파일러에서 어떻게 처리했느냐의 문제인것 같습니다.
32bit 컴파일러 들어세는 포인터를 4byte로 잡은거고 64bit 컴파일러에서는 포인터를 8byte로 잡은 것이라 생각됩니다.

왜 그렇게 했느냐 라는 질문을 한다면 보다 더 많은 데이터를 처리해야 할 필요성이 있기 때문이겠죠 ..

/***********************************
* 오늘 걷지 않으면 내일은 달려야 한다.
***********************************/


/***********************************
* 오늘 걷지 않으면 내일은 달려야 한다.
***********************************/

지리즈의 이미지

(32bit PC를 가지는)32bit CPU에서 운영되는 32bit운영체제에서
컴파일러로 강제로 64bit 포인터를 사용하게 컴파일하면 이바이너리가 실행될가요?

컴파일러가 잡는 것은 맞기는 한데,
컴파일러가 잡고 싶어서 잡는게 아니라,
바이너리가 실행될 수 있는 충족여건을 만족시키기 위해서 어쩔 수 할 뿐이지요.

There is no spoon. Neo from the Matrix 1999.

There is no spoon. Neo from the Matrix 1999.

mach의 이미지

오랜만에 보는 글이네요.
제가 익명으로 단 댓글도 얼핏보이는군요. ㅎㅎ

아직도 견해의 일치는 안되었나보군요. 다양성,...자연스럽게 보입니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

jeongheumjo의 이미지

32비트 시스템에서는 포인터가 4바이트
64비트 시스템에서는 포인터가 8바이트
입니다.

일반적으로 진정한 N비트 시스템이라 함은
- CPU가 한번에 처리할 수 있는 명령어의 크기가 N비트
- 한번에 전송할 수 있는 데이터의 크기(CPU와 메모리 사이에서)가 N비트
인 시스템입니다.

한번에 전송할 수 있는 데이터가 (가상)메모리 주소일 경우 32비트 시스템은 가상메모리가 2의 32승 즉, 4G 가 되고
한번에 전송할 수 있는 데이터가 (가상)메모리 주소일 경우 64비트 시스템은 가상메모리가 2의 64승 즉, 어마어마한 크기가 되죠.

그리하여 32비트 시스템에서는 가상메모리가 4G가 되고 포인터가 32비트인 것입니다.
64비트 시스템에서는 가상메모리가 2의 64승이 되고 포인터가 64비트....

이상 허접 답변이었습니다.

죠커의 이미지

...

이 긴 쓰레드가 무의미해지는 순간이군요.

이 전 글들을 읽어보십시요.

- 죠커's blog / HanIRC:#CN

freestyle의 이미지

컴퓨터가 어느 정도 체계를 갖추기 시작하면서부터

access할 메모리 주소의 최대 크기를 수용할 수 있는 포인터를 사용했고,
(즉 address bus의 크기만한 포인터)

물리적 측면에서 보면 이 수치와 포인터의 크기가 일치해야 합니다.

그러나, OS와 compiler의 제약에 따라 이 크기는 줄어들 수 있고

굳이 포인터의 크기가 정해지는 룰을 말해보자면

hardware -> OS -> compiler의 순입니다.

물론 현재 제가 주로 접한 시스템의 이야기일 뿐이고,

괴짜가 만든 시스템과 그 위에서 돌아가는 OS와 compiler라면 이야기는 달라지겠지요.

결론으로, 32bit 시스템에서 포인터의 최대 크기는 4바이트이고,

OS나 compiler에 따라 다를 수 있습니다.

단, 포인터의 크기가 이렇게 결정되면
어떤 자료형을 나타내든지 동일한 게 (퍼포먼스 측면에서나) 보편적입니다.

특수 용도에 따라 다르게 할 수는 있을 것입니다.

잘못된 내용은 가차없이 지적 부탁드립니다.
---------------------------
Go to the U-City

----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------

페이지

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.