포인터 이해란 글에 대해.

cinsk의 이미지

글 내용이, 자유 게시판에 어울리지 않지만, 원 글이 자유 게시판에 올라와 있어서 여기에 올립니다.
특정인을 비난/비하하기 위한 내용이 아니라는 것을 미리 밝힙니다.

먼저, 남에게 가르치거나 설명하기 위한 예제라는 느낌을 강하게 받아서, 제 의견을 말씀드리고자 합니다.

포인터 이해(1)에 나온 예제는 특별한 문제가 없어 보입니다. 다만 댓글 중에서 좀 우려가 되는 글은..

> 포인터와 주소를 같이 해석하고 있습니다. 즉 포인터는 주소의 한글 표현으로...
포인터는 주소(address)를 다루기 쉽게 하는 C/C++ 언어의 데이터 타입입니다. 하드웨어 주소와 완전히 같다고 볼 수는 없습니다. 미약하나마? 포인터는 주소를 추상화한 데이터 타입으로 보시는 게 맞을 것 같네요.

> 아! 그리고, 주소와 데이터는 완전히 다른 것입니다.
앞뒤 문맥이 없어서 확실히 이해할 수 없기에 뭐라 할 수는 없지만, 주소는 말 그대로 위치를 나타내는 표현이며, 데이터는 말 그대로 자료/정보를 의미합니다. 같다/다르다를 논할 수 있는 대상이 아닙니다. (예: 주소값이 저장되어 있는 데이터를 얼마든지 만들 수 있습니다.)

포인터 이해(2)에 나온 질문/코드는 바람직하지 않습니다. 이는 implementation에 따라 달라질 수 있기 때문입니다. 객관식 질문이라면, "그때그때 다르다"나, "주어진 정보만으로는 알 수 없음"이 정답이겠네요. 또 몇몇 분이 이미 지적하셨지만, 특정 크기라고 할 수 없을 뿐더러, 각 포인터의 크기도 다 다를 수 있습니다.

요약하면, char 계열을 제외하고, 다른 데이터 타입의 크기(포인터 포함)는 정해진 것이 없습니다. 따라서, XXX 시스템에서 데이터 타입의 크기는 이러합니다.란 목적의 코드라면 어느 정도 의미가 있겠지만, 이 코드의 출력의 값은 무엇일까요?란 목적이라면 잘못된 질문입니다.

포인터 이해(3)의 코드는 위와 같은 이유에서 바람직하지 않은 질문/코드입니다. char를 제외하고는 크기가 정해진 것이 없기 때문에, 잘못된 질문입니다.

만약, 꼭 특정 hardware에서 데이터 타입의 크기가 어떠하더라... 란 내용을 다루고 싶다면, C 표준과 더불어, 해당 hardware의 ABI 문서를 보기 바랍니다. (맨 아래에 관련 spec이 있습니다.)

여기에서 "표준안이라는게..."란 내용은 무슨 말인지 잘 이해가 가지 않더군요. C 언어 코드를 얘기하면서 왜 트랜지스터가 나오는지 모르겠습니다. 그리고 Richard Stallman은 POSIX를 설립한 것이 아니고, POSIX란 이름을 제안한 것입니다. http://www.opengroup.org/austin/papers/posix_faq.html 참고.

> 제가 지금까지 경험한 위의 표준안들에서,
> 데이터의 크기는(주소 말고... 주소는 아키텍쳐에 의존)
> 딱~ 정해지더군요.
언급하신 POSIX, ANSI C, ISO C는 표준안(draft standard)이 아니고 표준(standard)입니다.

> 딱~정해지더군요.
> 이것을 거짓이라고 지적하는 것에 대해서 인정할 수 없습니다.
음.. 제가 국어 실력이 부족해서인지, "딱~ 정해진다"란 말이 정확히 무엇을 의미하는지 모르겠네요.

전반적으로, 내용에 비해서 너무 단언?을 하고 계신다는 느낌을 받았습니다. 글의 내용을 보니, 남을 가르치는 입장에 계신 것 같은데, 항상 어떤 단언을 할 때에는 관련 내용을 좀 더 찾아보시고, 그 출처를 메모하는 습관을 기르시기 바랍니다. 특히, ISO C 표준, Single UNIX Spec을 가까이 하시고, 필요하다면 System V ABI spec(gabi, System V ABI - Intel386 정도를 더 보시면 될 것 같군요.

rgbi3307의 이미지

처음에 간단한 C코드로 포인터를 이해해 보고자 출발한 것인데,
제가 남을 가르치듯이 너무 단언한 부분이 많았습니다.
저의 얄팍한 지식으로 많은 분들의 기분을 상하게 했습니다.
죄송합니다~
저의 아내와도 많이 다툽니다.
"당신은 너무 일방적으로 자기 주장만 이야기 한다고..."
요즘 성격을 좀 고치려고 하는데, 힘이 드네요~
다시한번, 좋은 지적의 글 감사합니다.

From:
*알지비 (메신저: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.kr/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

academic의 이미지

글 내용과는 크게 상관없는 지엽적인 질문 드려 죄송합니다만...

해당 hardware의 ABI 문서라는 말이 나왔는데...

ABI 문서라는게 뭔가요? 아주 간단하게라도 말씀 부탁드립니다.

--
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

semmal의 이미지

간단하게 Application Binary Interface의 약자입니다.
------------------------------
How many legs does a dog have?

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

danskesb의 이미지

* Intel 386 ABI: http://www.sco.com/developers/devspecs/abi386-4.pdf
* AMD64 ABI: http://www.x86-64.org/documentation/abi.pdf
* ARM ABI: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.subset.swdev.abi/index.html
* MIPS ABI: http://www.mipsabi.org/
* SPARC: http://www.sparc.org/standards/ 여기에 있는 것 중 어느 게 ABI를 가리키는지는 잘 모르겠습니다.
* 이 외에도 여러 아키텍처마다 개별적인 ABI 문서가 있습니다.

AMD64는 x86의 확장이므로 ABI 문서를 읽다 보면 많이 비슷할 겁니다. ABI 문서들에는 자료형과 그 크기가 아키텍처별로 다 나와 있습니다.

---- 절취선 ----
http://blog.peremen.name

lifthrasiir의 이미지

좀 더 자세하게 설명하자면, ABI는 어떤 타입을 어떻게 표현하느냐(빅 엔디언이냐? 리틀 엔디언이냐? 16비트냐? 32비트냐? 특정한 타입은 메모리 상에서 몇 바이트 단위로 정렬되어 있어야 하는가? 따위)부터 시작해서 기계어 수준에서 함수를 어떻게 호출하느냐(인수를 어느 순서로 스택에 넣을 것인가? 어떤 레지스터를 보존하고 어떤 레지스터를 사용 가능하게 할 것인가? 특정한 인수를 무조건 레지스터에 넣게 할 것인가? 리턴값은 어느 레지스터 또는 어느 메모리에 저장될 것인가? 따위) 같은, 그러니까 기계어로 뭔가 프로그램을 짜기 위해 필요한 "약속들"을 포함한다고 생각하시면 됩니다.

운영체제 ABI의 경우 시스템 콜의 세부 사항, 오브젝트 및 실행 파일의 구조, 예외(C++ exception 같은 거요)를 처리하기 위한 메커니즘 따위가 포함되기도 하지만 이건 또 다른 얘기겠네요. 이 정도 수준까지 내려 오면 컴파일러마다 ABI가 다른 경우도 많습니다.

academic의 이미지

고맙습니다. 많은 도움이 되었습니다.

--
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

lysgenius의 이미지

인용 :

포인터 이해(1)에 나온 예제는 특별한 문제가 없어 보입니다. 다만 댓글 중에서 좀 우려가 되는 글은..

> 포인터와 주소를 같이 해석하고 있습니다. 즉 포인터는 주소의 한글 표현으로...
포인터는 주소(address)를 다루기 쉽게 하는 C/C++ 언어의 데이터 타입입니다. 하드웨어 주소와 완전히 같다고 볼 수는 없습니다. 미약하나마? 포인터는 주소를 추상화한 데이터 타입으로 보시는 게 맞을 것 같네요.

> 아! 그리고, 주소와 데이터는 완전히 다른 것입니다.
앞뒤 문맥이 없어서 확실히 이해할 수 없기에 뭐라 할 수는 없지만, 주소는 말 그대로 위치를 나타내는 표현이며, 데이터는 말 그대로 자료/정보를 의미합니다. 같다/다르다를 논할 수 있는 대상이 아닙니다. (예: 주소값이 저장되어 있는 데이터를 얼마든지 만들 수 있습니다.)

ㅎㅎ;; 왠지 찔리는.. 그래도 저 종이에 화살표 그림 그려서 할줄 알아요~~~^^ (여기선 왜 못하지;;)