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

6
points

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

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

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

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

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

익명 사용자의 이미지

사용하는 주소가 32비트이므로 포인터가 4바이트인거 아닌가요??

7
points

사용하는 주소가 32비트이므로 포인터가 4바이트인거 아닌가요??

4G 의 메모리 주소를 지정할 수 있기 때문이 아닐까요?32비트로 만

2
points

4G 의 메모리 주소를 지정할 수 있기 때문이 아닐까요?
32비트로 만들 수 있는 경우의 수가 2의32제곱인 4G잖아요.

익명 사용자의 이미지

32비트 CPU라고 불리는 이유가 바로 한번에 처리할 수 있는 데이터의

4
points

32비트 CPU라고 불리는 이유가 바로 한번에 처리할 수 있는 데이터의 크기(이를 word라고 하는데, 요새는 word가 그냥 16비트의 크기를 지칭하는데 쓰이더군요)가 32비트이기 때문입니다.

Re:

3
points

word의 크기는 computer architecture마다 다른 것으로 알고 있습니다. 32비트 시스템에서의 워드 크기는 otherwise specified되지 않은한 일반적으로 32비트라고 생각하시면 됩니다.

cjh의 이미지
10279
points

사용하는 플랫폼에서 프로세스 공간의 주소를 나타낼 때 어떤 크기를 쓰는지

7
points

사용하는 플랫폼에서 프로세스 공간의 주소를 나타낼 때 어떤 크기를 쓰는지에 따라 다릅니다. x86 계열의 보호 모드이면 32비트이고, 64비트 플랫폼이라면 64비트일 확률이 높겠죠.

http://en.wikipedia.org/wiki/Pointer

익명 사용자의 이미지

포인터는 메모리 주소를 담는 변수입니다.현재 가장 일반적으로 쓰이

9
points

포인터는 메모리 주소를 담는 변수입니다.

현재 가장 일반적으로 쓰이는 인텔 플랫폼(IA32, x86 등으로 불리우는)의 메모리 주소 크기가 32bit 입니다.

그래서 포인터 크기가 32bit 가 되는 것입니다.

포인터 크기는 아키텍쳐의 메모리 모델에 따라 결정됩니다.

수원 손님 말씀에 부연

1
point

옛날 옛날 한옛날 인텔 8086이 IBM PC의 uP로 채택이 됐을 때 얘기.

XT 8086의 Address Pin(버스 비트 크기)수가 16핀이었지요.
그시절엔 메모리가 64K-Byte면 뒤집어 쓰는 줄 알았으니까요.
(XT의 포인터 싸이즈: 16비트)

메모리 64K는 비좁았습니다.
그래서 어드레쓰를 20핀으로 만든 80286이 등장합니다.
1M-Byte까지 액세스 가능하게 됐습니다.
헌데 문제는 286이라는 녀석이 16비트 레지스터를 갖고 있는 놈이라.
20비트 어드레스를 포인팅하기가 곤란했단 말씀입니다.
여기에서 두통을 유발하는 어드레씽 모드가 나오고 세그먼트가 나오고
Near, Far...
(AT 286에서 포이터 싸이즈: Segment Pointer(16) << 4 + NearPointer(16) == 20)

32비트 386시대가 도래하여 286시절의 투통이 해소됩니다.
(IA32 프로텍티드 모드에서: 32)

moonzoo의 이미지
2145
points

맞춤법

-5
points

thyoo 씀:
메모리 64K는 비좁았습니다.

비좁았습니다. 이거 맞춤법 맞는 건가여?

"비좁았습니다"를 한글자 한글자 뚫어져라 쳐다보고 있노라면--;

웬지 철자가 어색한 단어같은 느낌이 드는건 저 뿐인가요?

근데 논리적으로 따져보면 맞는 말 같긴한데..

웬지 어색함을 지울수가 없네요..

제 기억이 맞다면, 20비트 어드레스는 XT(8088)로 기억합니다. A

7
points

제 기억이 맞다면, 20비트 어드레스는 XT(8088)로 기억합니다. AT(80286)은 16메가(24비트)로 알고 있습니다.

이야기하자면 CPU에 따라 틀리긴하지만, CPU가 다루는 레지스터의 크기 때문입니다. 64비트 CPU는 64비트 연산을 할수 있기 때문만은 아니겠지요. 주소를 담을수 있는 레지스터의 크기가 64비트면 포인터가 64비트가 되고 32비트면 포인터가 32비트가 되겠죠.
옛날 8088,80286같은 놈들은 레지스터 크기가 16비트(16비트 CPU라고 불렀었죠)였으나 물리적인 어드레스핀이 20,24개 였기 때문에 꽁수를 쓰게된것입니다. 16비트 레지스터를 2개 쓴거죠 ^^;. 당근 두개의 16비트 포인터를 써야ㅤㄷㅚㅆ죠.

[quote="ashuaria"]제 기억이 맞다면, 20비트 어드레스는

4
points

ashuaria 씀:
제 기억이 맞다면, 20비트 어드레스는 XT(8088)로 기억합니다. AT(80286)은 16메가(24비트)로 알고 있습니다.

8086 다뤄본지가 너무 오래돼서 부정확한 글을 썼군요. ^^
8088도 그림을 보니 20핀이군요.

찾아보니 죄다 밀려썼습니다.
정리하겠습니다.

8085 : (8비트) 16p
8088/8086 : 20p
80286: 24p
80386/486/pentium: 32p
pentium-pro: 36p

참고 싸이트
http://www.x86.org/articles/computalk/help.htm

Re: 맞춤법

2
points

moonzoo 씀:

웬지 철자가 어색한 단어같은 느낌이 드는건 저 뿐인가요?

'웬지' 가 아니라 '왠지' 아닌가요?
헤깔리네..

Re:

0
points

부사 왜인지의 준말이므로 왠지가 맞습니다.

헤깔리다 (x) -> 헛갈리다/헷갈리다

moonzoo의 이미지
2145
points

Re: 맞춤법

3
points

partout 씀:
moonzoo 씀:

웬지 철자가 어색한 단어같은 느낌이 드는건 저 뿐인가요?

'웬지' 가 아니라 '왠지' 아닌가요?
헤깔리네..

맞습니당--;

익명 사용자의 이미지

pointer가 32 bit인 이유는 32-bit machine의 add

3
points

pointer가 32 bit인 이유는 32-bit machine의 address space가 2^32이기 때문임. address space는 왜 2^32냐? bus가 32 bit이기 때문임.

씨에의 이미지
13324
points

포인터의 크기가 현재 플랫폼의 어드레스와 같다는 것은 거짓일 수도 있습니

3
points

포인터의 크기가 현재 플랫폼의 어드레스와 같다는 것은 거짓일 수도 있습니다.

워드단위로만 접근을 할 수 있는 시스템이라면 3번째 워드의 1번째 바이트의 의미를 담는 형태로 포인트가 구성되어 있을 수도 있고 그 경우에는 그것은 거짓이 됩니다. 그리고 그 경우엔 자료형에 따라서 포인터의 크기도 달라집니다.

3번째 워드의 1번째 바이트의 의미를 담는 형태란?

0
points

좀 구체적인 설명이 필요하지 않을까요?
포인터 변수는 메모리의 주소 값을 담고 잇는 변수를 의미하는데요.
그래서 32비트 CPU일 경우에는 최대 2^32 크기의 메모리를 가질 수 있고
그 번지를 변수에 담을려니 (0번지부터 2^32 - 1번지까지) 32비트의 메모리 공간이 필요한 것으로 알고 있는데요?
주소를 나타내는 값에 '3번째 워드의 1번째 바이트의 의미'를 담는 다는 말이 같은 우리나라 말인데도 전혀 이해가 되지 않는군요.

상세한 설명을 해주심이...

씨에의 이미지
13324
points

포인터는 메모리

1
point

포인터는 메모리 주소의 값을 의미하지는 않습니다. 이 쓰레드를 읽어보시면 더 자세히 알게되실 겁니다.

3번째 워드의 첫번째 바이트 식으로 쓰이는 하드웨어는 워드 단위의 접근만 허용하는 하드웨어입니다. 워드는 대체로 바이트 단위보다 크니 워드를 쪼개어서 쓰게되고 이럴 경우 char형 포인터는 어느 워드를 쪼개어서 쓴 것인지 체크하도록 설계됩니다.

세벌의 이미지
5499
points

Re: 맞춤법

3
points

partout 씀:
moonzoo 씀:

웬지 철자가 어색한 단어같은 느낌이 드는건 저 뿐인가요?

'웬지' 가 아니라 '왠지' 아닌가요?
헤깔리네..

헤깔리네가 아니고 헷갈리네가 맞겠죠?

그런데 이러다가 매 맞겠네요.주제와 관계없는 글 올린다고...

Re: 맞춤법

2
points

sebul 씀:

partout 씀:

moonzoo 씀:

웬지 철자가 어색한 단어같은 느낌이 드는건 저 뿐인가요?

'웬지' 가 아니라 '왠지' 아닌가요?
헤깔리네..

헤깔리네가 아니고 헷갈리네가 맞겠죠?

그런데 이러다가 매 맞겠六?주제와 관계없는 글 올린다고...

ㅎㅎ.. 그러네요..
그나저나 ... 매 맞을 일이긴 한데.. 이것도 나름대로 재미있네요.

x86 기준으로 하나의 세그먼트는 최대 크기 4gb를 가질 수 있게 되어

3
points

x86 기준으로 하나의 세그먼트는 최대 크기 4gb를 가질 수 있게 되어있습니다. (디스크립터에서 최대 limit을 적을 수 있는 양이 4gb(20비트 * 단위4k) 이기에 4gb를 지원합니다.)

이걸 표현하려면 32비트가 필요하죠 2^32

그래서 32비트입니다.

@_@홍홍홍..

익명 사용자의 이미지

* 386~ MMU(Memory Management Units)인텔이

5
points

* 386~ MMU(Memory Management Units)
인텔이 386만들고, 가장 자랑한 기술중 하나가 MMU를 내장한것입니다.
하드웨어 수준의 프로텍션 및 가상메모리 기법입니다.

* 메모리 관리 모드는 2가지가 있는데(운영체제 로딩시점에 프로그램으로 세팅하지요)
1) Flat memory model
- 하나의 세그먼트만 가지는 메모리 모델
- 한 세그먼트의 최대 크기는 4GB(2^32-1)까지 가능
2) Segmented Model
- 최대 16,383 세그먼트가 가능 (16k*4G=> 64 Tera Byte까지 가능;386일때 이미......)

* 인텔 프로세서를 채택한 운영체제는 하부구조로, 플랫 메모리 모델을 사용했습니다.예를 들어, NT, OS/2 및 Linux, 또는 X가 만든 운영체제 XX등 입니다.
이유는 세그먼트 모델보다, 단순하기 때문이기도 하고,( 프로그램짜기 쉬우니까.)
초기 GNU 개발도구(GCC등)이 기초 모델로 했던, 680x0 프로세서의 메모리 모델과도 유사했기 때문입니다.
그리고, 그 당시라면, 4기가메모리는 꿈의 메모리이기도 했습니다.(너무 크다는..)

* 포인터가 4바이트인 이유
대체로, 운영체제의 표준 워드크기를 씁니다.
운영체제 워드? 운영체제를 만들때, 하부 CPU가 최소 얼마(n-bits)라는 것을 보통 가정합니다. 운영체제 설계가 가정한 하부구조(하드웨어)가 맞지 않으면, 하드웨어 추상화를 통해 달성합니다.(당연히, 최적의 하드웨어가 가장 빠르지요. 나머지는 에뮬레이션하려니 느려지고, ...그래도, 돕니다....)
리눅스를 Sun이나 HP등의 머신으로 포팅한 멋진 사람들의 기고를 참고하시길.
* 표준 유닉스는 32비트 머신을 기반으로 설계되었습니다.
* 리눅스, NT, OS/2도 마찬가지로, 하부 CPU가 인텔프로세서인 경우, 하부 메모리구조는 플랫 모델썼고, 최대 메모리는 4GB였습니다.

* 다 과거형으로 쓴것은 지금도 마찬가지겠지만, 워낙 혁신적인 리눅스라, 지금 어떤지 몰라서 입니다.( 제생각에, 플랫메모리 + 알파를 쓸듯합니다., 세그먼트 모델로 하면 포터빌리티 마구 떨어질테구, 속도 마구 느려질테구, 필요한가?.....)

* 여담으로 64비트 프로세서 써도 별로 안빨라지는 패키지들이 있는데, 그 이유들중 하나는 64비트 프로세서에 32비트 프로세서 에뮬레이션모드가 동작해서 돌릴때가 있었습니다.

ㅡ,.ㅡ;;의 이미지
12431
points

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

4
points

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

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

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

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

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

흠.. 32 비트 (운영체) / 8비트(1바이트) = 4바이트(주소체계)
32비트주소체계로 운영되는 시스템 => 32비트 운영체 => 32bit OS
32비트가 4바이트랑 같은말인데 왜그러냐는건...
비트와 바이트의 관계를 알려주세요..

cinsk의 이미지
11955
points

대부분 시스템에서 포인터의 타입에 상관없이 포인터의 크기가 CPU의 ad

11
points

대부분 시스템에서 포인터의 타입에 상관없이 포인터의 크기가 CPU의 address space를 전부 access 할 수 있는 크기로 고정되어 있지만, 반드시 그렇다고 보장할 수 없습니다. offset 값만을 가지고 좁은 구역에서 access할 수 있는 포인터가 존재할 수 있기 때문에..

따라서 N bit machine에서 pointer의 크기는 N bit이다라고 말하는 것은 조금 성급한 정의가 아닌가 합니다.

또한 type에 상관없이 모든 종류의 pointer가 같은 크기를 가진다라고 말할 수도 없습니다.

김일영의 이미지
7361
points

그 말을 하려던 참이었는데...

0
points

마침 더 잘 설명해 주셨네요. 역시 고수는 다르시군여~

포인터는 포인터일뿐 크기라든지 등등은 아무런 정해진 바가 없으므로
억지로 어떤 특징을 가정하려는 것은 피해야 할 것 같다는 생각입니다.

litdream의 이미지
2725
points

Re: 맞춤법

1
point

moonzoo 씀:
thyoo 씀:
메모리 64K는 비좁았습니다.

비좁았습니다. 이거 맞춤법 맞는 건가여?

"비좁았습니다"를 한글자 한글자 뚫어져라 쳐다보고 있노라면--;

웬지 철자가 어색한 단어같은 느낌이 드는건 저 뿐인가요?

근데 논리적으로 따져보면 맞는 말 같긴한데..

웬지 어색함을 지울수가 없네요..

'비좁다' 는 표준말인가요, 아니면 사투리인가요?
만약 사투리라면 '비좁다' 의 표준말은 뭐죠?
지금 '비좁았습니다.' 를 다른말로 바꿔보려고 해도, 도통 다른 단어가
떠오르지 않습니다.. 머리가 굳어가는 느낌...

익명 사용자의 이미지

Re: 맞춤법

4
points

litdream 씀:
moonzoo 씀:
thyoo 씀:
메모리 64K는 비좁았습니다.

비좁았습니다. 이거 맞춤법 맞는 건가여?

"비좁았습니다"를 한글자 한글자 뚫어져라 쳐다보고 있노라면--;

웬지 철자가 어색한 단어같은 느낌이 드는건 저 뿐인가요?

근데 논리적으로 따져보면 맞는 말 같긴한데..

웬지 어색함을 지울수가 없네요..

'비좁다' 는 표준말인가요, 아니면 사투리인가요?
만약 사투리라면 '비좁다' 의 표준말은 뭐죠?
지금 '비좁았습니다.' 를 다른말로 바꿔보려고 해도, 도통 다른 단어가
떠오르지 않습니다.. 머리가 굳어가는 느낌...

인용:
......중략 .....
저도 웹을 검색해 보기 전까지는 '비싸다' 의 '비'는 한자어 '아닐 비(非)'자 인줄
알았습니다. 그런데 '아니다'라는 뜻으로 쓰이는 접두사 '비'는 주로 한자어 앞에
붙는다고 했으니 '싸다'는 순 우리말로서, '비싸다'의 '비'는 '아니다'의 뜻을 나타내는
접두사 '非' 가 아님을 알수 있습니다. 같은 맥락으로 '비웃다'의 '비'도, '비좁다'의
'비'도 모두 아니다 라는 뜻인 한자어 접두사인 '非'는 아니라는 뜻이겠죠. '비웃다'나
'비좁다' 나 각각 분해할 수 없는 고유한 뜻을 가진 한 단어인 셈 입니다
......중략 .....
좁다 라는 말은 웃다 라는 말보다는 좀 더 쉽습니다.
좁다는 넓이를 나타내는 개념으로서 폭이나 공간이 '적은'의 뜻이 있으니 반대말로는 당연히
'넓다' 라는 말이 쉽게 떠 오르니까요.
......중략 .....

참고 : http://kdaq.empas.com/dbdic/db_view.tsp?num=4166927&ps=src
음 국어 공부하게 하는군요. :evil:

익명 사용자의 이미지

국어사전에서...[quote]비좁다 비-좁다 [비ː―따

3
points

국어사전에서...

인용:
비좁다

비-좁다 [비ː―따] <형용사> 여럿이 촘촘히 들어 있어 빈 자리가 몹시 적다. ¶원래 통로가 좁은 시장 골목이 장을 보러 나온 주부들로 더욱 비좁았다. <작은말> 배좁다.

음 ,.... 배좁다......! 쿵~~! :roll:

ㅡ,.ㅡ;;의 이미지
12431
points

[quote="cinsk"]대부분 시스템에서 포인터의 타입에 상관없이 포

-2
points

cinsk 씀:
대부분 시스템에서 포인터의 타입에 상관없이 포인터의 크기가 CPU의 address space를 전부 access 할 수 있는 크기로 고정되어 있지만, 반드시 그렇다고 보장할 수 없습니다. offset 값만을 가지고 좁은 구역에서 access할 수 있는 포인터가 존재할 수 있기 때문에..

따라서 N bit machine에서 pointer의 크기는 N bit이다라고 말하는 것은 조금 성급한 정의가 아닌가 합니다.

또한 type에 상관없이 모든 종류의 pointer가 같은 크기를 가진다라고 말할 수도 없습니다.


만일 그런이유라면 첨부터 N bit 머신 이라고 이름붙인 자체가 잘못이죠.. 그리고 Nbit 머신이 Nbit주소인 통상적인 이유를 말하겠죠 그렇지않다면 아래와같은경우도 생기겠죠.
A:나는집으로 달려갔다
B:당신은 그렇게 말할수 없다 왜냐면 골목모퉁이를 돌때 완전히 달렸다고 할수 없기때문이다.
A: ㅡ,.ㅡ;;쿵..

Re: 맞춤법

2
points

moonzoo 씀:
thyoo 씀:
메모리 64K는 비좁았습니다.

비좁았습니다. 이거 맞춤법 맞는 건가여?

"비좁았습니다"를 한글자 한글자 뚫어져라 쳐다보고 있노라면--;

웬지 철자가 어색한 단어같은 느낌이 드는건 저 뿐인가요?

근데 논리적으로 따져보면 맞는 말 같긴한데..

웬지 어색함을 지울수가 없네요..


가끔 그런 일이 있더군요.
내가 쓴 말이고 딴사람은 아무렇지도 않게 생각하는데 종종 무슨 말을 써놓은 건지 잘 이해도 안 가고
뭔가 어색한 느낌이 드는 경우가 있더군요.
길을 걷다가 갑자기 어질하는 경우와 비슷한 걸까요?
둘 다 뇌의 기능인데 하나는 균형감각이 잠깐 맛이 가는 경우고
하나는 언어 감각이 잠깐 맛이 가는 경우고, 그렇게 생각하고 있습니다.

전 그런 느낌이 들 때마다 마치 딴 세상에 혼자들어간 듯 기분이 좋더군요.

훗. 변태

익명 사용자의 이미지

Re: 맞춤법

3
points

xster 씀:

...
전 그런 느낌이 들 때마다 마치 딴 세상에 혼자들어간 듯 기분이 좋더군요.
...

혼자가면, 외롭지 않나요? :twisted:

cinsk의 이미지
11955
points

[quote="ㅡ,.ㅡ;;"][quote="cinsk"]대부분 시스템에서

8
points

ㅡ,.ㅡ;; 씀:
cinsk 씀:
대부분 시스템에서 포인터의 타입에 상관없이 포인터의 크기가 CPU의 address space를 전부 access 할 수 있는 크기로 고정되어 있지만, 반드시 그렇다고 보장할 수 없습니다. offset 값만을 가지고 좁은 구역에서 access할 수 있는 포인터가 존재할 수 있기 때문에..

따라서 N bit machine에서 pointer의 크기는 N bit이다라고 말하는 것은 조금 성급한 정의가 아닌가 합니다.

또한 type에 상관없이 모든 종류의 pointer가 같은 크기를 가진다라고 말할 수도 없습니다.


만일 그런이유라면 첨부터 N bit 머신 이라고 이름붙인 자체가 잘못이죠.. 그리고 Nbit 머신이 Nbit주소인 통상적인 이유를 말하겠죠 그렇지않다면 아래와같은경우도 생기겠죠.
A:나는집으로 달려갔다
B:당신은 그렇게 말할수 없다 왜냐면 골목모퉁이를 돌때 완전히 달렸다고 할수 없기때문이다.
A: ㅡ,.ㅡ;;쿵..

제가 말한 것은 포인터의 크기가 타입이나 N-bit machine에 따라 항상 고정되어 있다고 보장할 수 없다는 것입니다.

즉, sizeof(void *) == sizeof(float *) == sizeof(int *) 등과 같은 관계가 보장되어 있지 않는다는 것을 말하고 싶었습니다. 제가 잘못 알고 있는 것인가요?
또한 32bit 머신, 정확히 말해 int가 32bit인 컴파일러에서 반드시 pointer가 32-bit라고 가정할 수 없다는 것을 말하고 싶었습니다.

doldori의 이미지
5441
points

[quote="cinsk"]제가 말한 것은 포인터의 크기가 타입이나

5
points

cinsk 씀:

제가 말한 것은 포인터의 크기가 타입이나 N-bit machine에 따라 항상 고정되어 있다고 보장할 수 없다는 것입니다.

즉, sizeof(void *) == sizeof(float *) == sizeof(int *) 등과 같은 관계가 보장되어 있지 않는다는 것을 말하고 싶었습니다. 제가 잘못 알고 있는 것인가요?
또한 32bit 머신, 정확히 말해 int가 32bit인 컴파일러에서 반드시 pointer가 32-bit라고 가정할 수 없다는 것을 말하고 싶었습니다.


적어도 C나 C++에 한해서라면 cinsk님이 알고 계신 것이 맞습니다.
이것 말고도 함부로 가정해서는 안될 것이 많이 있습니다.

atie의 이미지
18064
points

sizeof(int*) vs sizeof(int)[url]http:/

5
points

sizeof(int*) vs sizeof(int)
http://www.clanghelp.com/sizeofint_vs_sizeofint-7418256-5298-a.html

IBM AS400 (64bit machine) sizeof(size_t) == 4, sizeof(int*) == 16
메모리와 디스크를 하나의 가상 메모리로 잡아야 하기 때문에 포인터의 크기가 무척 크지요.

익명 사용자의 이미지

[quote="cinsk"]...즉, sizeof(void *)

2
points

cinsk 씀:

...
즉, sizeof(void *) == sizeof(float *) == sizeof(int *) 등과 같은 관계가 보장되어 있지 않는다
...

이것은 보장되어야 한다고 생각하는데요?

doldori의 이미지
5441
points

[quote="Anonymous"][quote="cinsk"]...

5
points

Anonymous 씀:
cinsk 씀:

...
즉, sizeof(void *) == sizeof(float *) == sizeof(int *) 등과 같은 관계가 보장되어 있지 않는다
...

이것은 보장되어야 한다고 생각하는데요?


보장되는 것은 sizeof(void*) == sizeof(char*) == sizeof(signed char*) == sizeof(unsigned char*) 뿐입니다.
K&R 시절에는 char*가 void* 역할을 했는데 이것이 표준에도 반영됐기 때문인 것으로 알고 있습니다.

ㅡ,.ㅡ;;의 이미지
12431
points

[quote="cinsk"]즉, sizeof(void *) == size

1
point

cinsk 씀:
즉, sizeof(void *) == sizeof(float *) == sizeof(int *) 등과 같은 관계가 보장되어 있지 않는다는 것을 말하고 싶었습니다. 제가 잘못 알고 있는 것인가요?

그렇지 않은경우가 있다면 그것은 일반적인 void *형태의 크기보다 특수하게 작게 사용하려는 목적이나 일반적인 번지의 크기는
sizeof(void *) 로 봐야할것아닌가요?
아이: 바지는왜 가랭이가 두개야?
엄마: 그건사람다리가 두개기때문이지..
지나가던사람 : 다리한개인사람도 있죠.. 그렇게 말하면안되죠.
라는거나 비유가 되지 않나요..

인용:

IBM AS400 (64bit machine) sizeof(size_t) == 4, sizeof(int*) == 16

일단 이예기는 좀다른예기구요. size_t는 int나 포인터크기와는 다르죠.

씨에의 이미지
13324
points

[quote="ㅡ,.ㅡ;;"]그렇지 않은경우가 있다면 그것은 일반적인 v

2
points

ㅡ,.ㅡ;; 씀:
그렇지 않은경우가 있다면 그것은 일반적인 void *형태의 크기보다 특수하게 작게 사용하려는 목적이나 일반적인 번지의 크기는
sizeof(void *) 로 봐야할것아닌가요

여러 머신에서 메모리의 한 위치를 자연스럽게 가리키기 위해서 표준에 그렇게 정의되어 있습니다.

int의 형의 크기가 32비트로 정해져 있는게 아니라 short <= int <= long 으로 되어 있는 것 처럼 그 머신에 맞는 형태로 자연스럽게 구현하도록 되어있습니다.

오히려 PC라는 환경에 C언어를 종속시킬려고 하는 것이 문제가 아닐까요?

ㅡ,.ㅡ;; 씀:
일단 이예기는 좀다른예기구요. size_t는 int나 포인터크기와는 다르죠.

typedef int size_t 되어 있는 구현도 많습니다. size_t도 다른 자료형을 통해서 구현됩니다.

doldori의 이미지
5441
points

맞는 말씀입니다만[quote="CN"]typedef int s

6
points

맞는 말씀입니다만

CN 씀:

typedef int size_t 되어 있는 구현도 많습니다.

이런 구현이 있다면 표준을 따르는 구현은 아닙니다.
size_t는 반드시 무부호 정수형이어야 합니다.

[quote="Anonymous"][quote="cinsk"]...

2
points

Anonymous 씀:
cinsk 씀:

...
즉, sizeof(void *) == sizeof(float *) == sizeof(int *) 등과 같은 관계가 보장되어 있지 않는다
...

이것은 보장되어야 한다고 생각하는데요?

꼭 그럴 필요는 없지 않겠습니까?

비유를 하자면, 호텔의 방을 하나 지정하기 위해서는 4자리수가 필요하다 하더라도, 층을 하나 지정하기 위해서는 2자리수만 있어도 되는 것과 같다고 할까요. 데이터형 자체가 커지면 그만큼 그 형의 개체가 놓일 수 있는 위치의 가짓수가 적어지기 때문에, 크기가 작은 포인터를 쓰는 것이 가능합니다. (하려면 할 수 있다는 얘기입니다. 꼭 바람직하다기보다는.)

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

4
points

ㅡ,.ㅡ;; 씀:
32비트가 4바이트랑 같은말인데 왜그러냐는건...
비트와 바이트의 관계를 알려주세요..

이건 그냥 사족입니다만, 1바이트가 늘 8비트인 것은 아닙니다. 1바이트가 9비트인 시스템도 존재하고, 실제로 1바이트가 16비트여서 sizeof(char)==sizeof(int)==1, sizeof(long)==2인 DSP 칩에서 프로그래밍도 해 봤습니다. :D

따라서 "32비트가 4바이트와 같은 말이다"라는 표현은 조심해서 사용해야 할 것 같네요. (그래서 어떤 분야에서는 아예 바이트라는 말 대신 옥텟(octet; 정의상 8비트)이라는 용어를 쓰기도 하죠.)

김일영의 이미지
7361
points

여담입니다만

1
point

윗글과 별 상관 없는 이야깁니다만
1바이트가 9비트인 시스템에서도 sizeof(char) == 1 입니다.
하지만 다른 타입의 크기는 정해져 있지 않습니다.

포인터도 대략 마찬가지로 생각하면 될 것 같습니다.
우리집 주소랑 옆집 주소가 길이가 같아야 하는건 아니듯;;;

익명 사용자의 이미지

[quote="musiphil"]...꼭 그럴 필요는 없지 않겠습

2
points

musiphil 씀:

...
꼭 그럴 필요는 없지 않겠습니까?
...

저는 생각이 다릅니다.

1. 함수포인터를 고려해보면
- 정수형 함수포인터 : 4바이트라고 가정
- 실수형 함수포인터 : 2바이트라고 가정
- TEXT영역(Code)의 액세스가 난해하겠습니다.
?
2. 가정 32비트 어드레스 공간에서...
가정
- int 16비트 포인터
- char 8비트 포인터
주소공간을 액세스(포인터사용시마다)할때마다, 절대번지, 상대번지등을 고민하면서 코딩해야겠군요.
filling algorithm같은(구한말얘기지만) 그래픽스 프리미티브 제작시 고민이 좀 되겠군요.
3. C 프로그래머의 실수가 더 많아질것 같고요.
- 도스시절에 하던 메모리 모델(tiny,small, ~, huge) 및 near, far modifier도 필요할테고 같은 구문이 필요하게 될것 같군요.
- 프로그래머들은 이 문제를 다시 돌이켜봐야할테고,
- 아울러, 컴파일러도 손좀봐야겠고),....
4. 포터빌리티가 떨어질것 같다는...
5. 컴파일러, 링커, 로더 제작자가 고민이 많아지겠네요.

익명 사용자의 이미지

2바이트가 부족해서 4바이트를 쓴거고..4바이트는 어느정도 충분하니까

2
points

2바이트가 부족해서 4바이트를 쓴거고..
4바이트는 어느정도 충분하니까.. 오래쓰고 있는게 아닐까요?
앞으로 곧 8바이트로 늘어나지 않겠어요?

jongwooh의 이미지
3050
points

일반적으로 포인터의 크기는 '프로그램 카운터(PC)' 또는 '인스트럭션

4
points

일반적으로 포인터의 크기는 '프로그램 카운터(PC)' 또는 '인스트럭션 포인터(IP)' 이라고 부르는 레지스터 크기와 같습니다. address 가능한 메모리 크기와 같다는 것이죠.

8비트 프로세서들의 경우에 프로그램 카운터를 8비트로 두기엔 너무 프로그램이 들어갈 공간이 작으니까(256바이트로 프로그램을 짜라고..) 대부분 16비트 카운터를 가지고 있고 그래서 8비트 프로세서들도 포인터는 16비트(2바이트) 인 경우가 대부분입니다.

그리고 아시다시피 대부분의 32비트 RISC,CISC 프로세서들도 처음엔 32비트 프로그램 카운터를 사용했다가 몇년 전부터 64비트로 확장되면서 카운터도 자연스럽게 64비트 레지스터를 쓰게끔 되었습니다. 하지만 포인터마다 64비트를 지정하는건 너무 낭비이기 때문에 64비트 머신들도 32비트 포인터를 쓰는 경우가 종종 있습니다. 어드레싱을 32비트로 해도 대부분의 프로그램에서 충분하기 때문에..

씨에의 이미지
13324
points

[quote="Anonymous"][quote="musiphil"].

4
points

Anonymous 씀:
musiphil 씀:

...
꼭 그럴 필요는 없지 않겠습니까?
...

저는 생각이 다릅니다.

1. 함수포인터를 고려해보면
- 정수형 함수포인터 : 4바이트라고 가정
- 실수형 함수포인터 : 2바이트라고 가정
- TEXT영역(Code)의 액세스가 난해하겠습니다.
?
2. 가정 32비트 어드레스 공간에서...
가정
- int 16비트 포인터
- char 8비트 포인터
주소공간을 액세스(포인터사용시마다)할때마다, 절대번지, 상대번지등을 고민하면서 코딩해야겠군요.
filling algorithm같은(구한말얘기지만) 그래픽스 프리미티브 제작시 고민이 좀 되겠군요.
3. C 프로그래머의 실수가 더 많아질것 같고요.
- 도스시절에 하던 메모리 모델(tiny,small, ~, huge) 및 near, far modifier도 필요할테고 같은 구문이 필요하게 될것 같군요.
- 프로그래머들은 이 문제를 다시 돌이켜봐야할테고,
- 아울러, 컴파일러도 손좀봐야겠고),....
4. 포터빌리티가 떨어질것 같다는...
5. 컴파일러, 링커, 로더 제작자가 고민이 많아지겠네요.

포인터의 크기가 동일하지 않기 때문에 컴파일러, 링커, 로더 개발자가 편해질 것입니다. word단위의 머신에서 char를 word단위즤 자료형과 같은 방법으로 지정할려면 word단위의 자료형의 지정이 비효율적일 적이고 자연스럽지 않을 것입니다.

말씀하신 이식성에 대한 부분은 포인터에 적합하지 않은 자료를 가리킬려고 하는 행위자체가 잘못된 프로그램 습관이라고 생각합니다. 적합한 포인터 사용과 generic pointer(void *)의 범위에 벗어나는 트릭은 피하는 편이 옳다고 생각합니다.

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

1
point

musiphil 씀:
ㅡ,.ㅡ;; 씀:
32비트가 4바이트랑 같은말인데 왜그러냐는건...
비트와 바이트의 관계를 알려주세요..

이건 그냥 사족입니다만, 1바이트가 늘 8비트인 것은 아닙니다. 1바이트가 9비트인 시스템도 존재하고, 실제로 1바이트가 16비트여서 sizeof(char)==sizeof(int)==1, sizeof(long)==2인 DSP 칩에서 프로그래밍도 해 봤습니다. :D

따라서 "32비트가 4바이트와 같은 말이다"라는 표현은 조심해서 사용해야 할 것 같네요. (그래서 어떤 분야에서는 아예 바이트라는 말 대신 옥텟(octet; 정의상 8비트)이라는 용어를 쓰기도 하죠.)

그럼 정확한 바이트의 정의는 뭘까요? -_-;;
네이버 백과사전 기준으로 8비트가 1바이트라고 정의되어있습니다만..
http://100.naver.com/100.php?id=717109

nohmad의 이미지
3168
points

http://en.wikipedia.org/wiki/Byte[qu

5
points

http://en.wikipedia.org/wiki/Byte

wikipedia 씀:
A contiguous sequence of a fixed number of bits. On modern computers, an eight-bit byte or octet is by far the most common. This was not always the case. Certain older models have used six-, seven-, or nine-bit bytes - for instance on the 36-bit architecture of the PDP-10. Another example of a non eight-bit sequence is the 12-bit slab of the NCR-315. A byte is always atomic on the system, meaning that it is the smallest addressable unit. An eight-bit byte can hold 256 possible values (28 = 256) -- enough to store an unsigned integer ranging from 0 to 255, a signed integer from -128 to 127, or a character of a seven-bit (such as ASCII) or eight-bit character encoding.

네이버 사전(두산세계대백과)은 특정분야의 전문가들이 참고로 사용하기에는 지나치게 내용이 빈약합니다.

임수서룬뫼의 이미지
37217
points

맞습니다.

2
points

1바이트가 8비트가 아닐 수도 있습니다.

씨에의 이미지
13324
points

K&amp;R 첫번째 판에도 1byte가 9bit인 머신을 소개하고 있습

3
points

K&R 첫번째 판에도 1byte가 9bit인 머신을 소개하고 있습니다.

cinsk의 이미지
11955
points

1 byte는 CHAR_BIT만큼 bit를 가집니다.

7
points

1 byte는 CHAR_BIT만큼 bit를 가집니다.

doldori의 이미지
5441
points

또는 std::numeric_limits&lt;unsigned char&

4
points

또는 std::numeric_limits<unsigned char>::digits 만큼의 bit수를 갖습니다. :)

ㅡ,.ㅡ;;의 이미지
12431
points

32비트OS 라면 8비트가 1바이트겠죠..

-4
points

32비트OS 라면 8비트가 1바이트겠죠..

nohmad의 이미지
3168
points

[quote="ㅡ,.ㅡ;;"]32비트OS 라면 8비트가 1바이트겠죠..[

0
points

ㅡ,.ㅡ;; 씀:
32비트OS 라면 8비트가 1바이트겠죠..

아니라고 그렇게 얘기하는데도 기운 빠지는 얘기를 하시는군요.

덧말: 포인터가 32비트냐에서 1바이트가 8비트냐로 공이 넘어갔군요.

ㅡ,.ㅡ;;의 이미지
12431
points

[quote="nohmad"][quote="ㅡ,.ㅡ;;"]32비트OS 라

1
point

nohmad 씀:
ㅡ,.ㅡ;; 씀:
32비트OS 라면 8비트가 1바이트겠죠..

아니라고 그렇게 얘기하는데도 기운 빠지는 얘기를 하시는군요.

덧말: 포인터가 32비트냐에서 1바이트가 8비트냐로 공이 넘어갔군요.

제가 사오정인가보죠..ㅡ,.ㅡ;;
근데 아직도 모르겠는걸요.. 32비트OS 중에 8비트가 1바이트가 아닌 OS가 어떤게 있죠?

애초 이쓰레드의 질문은
"32비트 운영체제에서 포인터는 4바이트로 알고 있고 당연하다고 ..."
였습니다. 전 공을 어디로 넘긴게 아니라 계속 "32비트 운영체제 하에서.." 의 토론이라고 생각하고 있었는데요..

4바이트 인 이유는 메모리를 가르킬려면 그정도 범위의 값이 필요 함으로

1
point

4바이트 인 이유는 메모리를 가르킬려면 그정도 범위의 값이 필요 함으로,,

포인터 크기는 CPU의 인덱스 레지스터의 영향을 받습니다.전적으로 C

3
points

포인터 크기는 CPU의 인덱스 레지스터의 영향을 받습니다.
전적으로 CPU의 레지스터 조건에서 최대성능을 이끌어내는 (최소한의 기계어 코드로 구성되는) 크기로 설정됨이 타당합니다

다음과 같은 C코드와 어셈블리 인스트럭션이 있다면,

int* ptr = 0xFFFF;
int var = *ptr;

LD  IX, #FFFFh
LD  A, (IX)

만약 IX라는 인덱스레지스터의 크기가 16비트 크기라면 이 CPU 기반의 머신에서는 sizeof(int*) == 2 일때 최적의 성능을 발휘합니다.
비슷한 맥락에서 프로그램의 실행위치를 기억하는 프로그램 카운터(PC)의 비트폭에 따라 함수 포인터의 크기가 결정되겠습니다.

다만, OS(플랫폼)수준의 가상메모리 에뮬레이션이 지원되거나, 아키텍쳐의 단순화를 도모하거나, 보편적인 컴파일러와의 호환성 향상을 위해 (성능저하에도 불구하고) sizeof(int*) = 4 인 모드를 컴파일러가 지원할 수도 있겠네요.

사족 : 결국 프로그램은 인간이 원하는 동작을 하기 위한 절차의 기술에 지나지 않음을 재확인 합니다. 코드크기가 작다고 효율적이라 단정할 수 없으며, 실행이 빠르다고 효율적이라 단정할 수 없으며, 프로그래밍 모델이 심플하다고 효율적이라 단정할 수 없으니, 이는 모두가 쓰는 사람의 목적에 준한다는... (ㅡ,.ㅡ)

저도 한마디만 할께요.pointer는 메모리 주소의 번지를 담는것

4
points

저도 한마디만 할께요.

pointer는 메모리 주소의 번지를 담는것입니다. 따라서 그 CPU, architecture가 사용하는(다루는) PC(Program Counter)와 같은(혹은 그와 비슷한) 레지스터의 크기에 영향을 받습니다. AMD64의 경우는 64bit mode에서 그 레지스터가 64비트를 쓰기 때문에 64비트 모드에서 포인터의 크기가 64비트가 되는것 뿐입니다.

여러분들이 헷갈리는것이 있는데, 버스의 크기(혹은 bandwidth)라고 하는것을 말씀하실때는 확실히 구분 하셔서 이야기를 하셔야됩니다.
I/O bus의 경우 이미 pentium시절때 부터 64bit의 크기로 가고 있습니다.
I/O bus의 그 비트수는 단순히 데이터를 전송 할수 있는 능력을 높이기 위한 것 뿐이라고 생각을 하시면 됩니다. 즉 IO bus bandwidth= bus size 64bit * 100Mhz = 800MB/sec(물론 peak치 일뿐입니다.) 라는것을 도출할때 쓰이는 버스입니다.
요즘 많이들 쓰시는 듀얼 체널을 보면 메모리 bus는 64bit 메모리 모듈을 2개를 동시쓸수 있게 해서 128bit를 내는것입니다.

갑자기 삼천포로 빠졌네요. 음 MIPS의 R4400(기억이 가물)이라는 CPU가 있었습니다.
이놈은 GPR(General purpose register)는 128bit이였지만, PC는 64bit, ALU는 32bit였던것으로 기억합니다. 포인터는 64bit였지만 32bit 정수연산을 하는 특이한 CPU로 기억됩니다. (벡터 유닛은 128bit 연산을 했고요)
즉, CPU의 ALU와 GPR과 PC의 비트가 다 다를수도 있습니다.

결국 제가 생각 해볼때는 PC를 몇비트를 쓰는가가 포인터의 크기를 결정하게 되겠네요.

또 다른 사족이지만, 요즘 나오는 CPU들의 SSE와 같은 연산들은 128bit Vector Register들이 존재하고 128bit 연산도 가능하죠 ^^;
SIMD라서 메모리 bandwidth를 peak에 근접하게 사용 가능하죠.

만고 제 생각입니다.

오우 벌써 설명을 위에 하셨군요...^^;

3
points

오우 벌써 설명을 위에 하셨군요...^^;

뭔소리들 하시는지..

-7
points

포인터는 말그대로 주소만을 담을 수 있는 그릇이에요-_-포인터가 32bit환경에서 4byte인 이유는 그 이상 필요가 없기때문이죠-_-현존하는 메모리가 아무리 크다하여도 2의 32승로 그 주소의 표현이 가능하기 때문이죠...다들 논점에서 벗어난 듯하네요-_-~

씨에의 이미지
13324
points

Re: 뭔소리들 하시는지..

3
points

zeroty 씀:
포인터는 말그대로 주소만을 담을 수 있는 그릇이에요-_-포인터가 32bit환경에서 4byte인 이유는 그 이상 필요가 없기때문이죠-_-현존하는 메모리가 아무리 크다하여도 2의 32승로 그 주소의 표현이 가능하기 때문이죠...다들 논점에서 벗어난 듯하네요-_-~

C/C++ 표준에서의 포인터는 선형 메모리 모델과 상관없습니다.

각자의 플랫폼에 적합한 방법으로 구현하는 것이 일상적입니다만 2의 32승의 주소로 표현은 부적합해 보입니다.

Re: 뭔소리들 하시는지..

-7
points

CN 씀:
zeroty 씀:
포인터는 말그대로 주소만을 담을 수 있는 그릇이에요-_-포인터가 32bit환경에서 4byte인 이유는 그 이상 필요가 없기때문이죠-_-현존하는 메모리가 아무리 크다하여도 2의 32승로 그 주소의 표현이 가능하기 때문이죠...다들 논점에서 벗어난 듯하네요-_-~

C/C++ 표준에서의 포인터는 선형 메모리 모델과 상관없습니다.

각자의 플랫폼에 적합한 방법으로 구현하는 것이 일상적입니다만 2의 32승의 주소로 표현은 부적합해 보입니다.

1byte는 8bit이며 4byte는 32bit이므로 포인터는 2의 32승만큼 표현이 가능하다. 2의 32승이면 20억이 넘으므로 포인터는 20억개의 위치를 저장할 수 있게 된다. 그러므로 현존하는 메모리가 크다고 하더라도 4byte만으로 충분히 모두 access가 가능하고 처리할 수 있게 된다. 더 자세한 사항은 유닉스 시스템 프로그래밍(2002년 한빛미디어 정재은)씨의 이메일 주소로 질문 해 보시길 바람

imarchie@hamail.net

씨에의 이미지
13324
points

포인터는 선형

4
points

포인터는 선형 메모리 모델과 상관이 없기 때문에 2의 32승이니 모든 주소를 가르킬 수 있다는 접근이 부적당하다는 것입니다. 선형 메모리 모델을 벗어나지 않고서는 이해하시지 못합니다. 포인터에 대해 사람들이 말하는 것은 선형 메모리 모델이 아니라는 것입니다. 이 점을 이해하시지 못하고 계속 줄 세울 수 있다고 답변하시는 것이 아쉽습니다.

- CN의 낙서장 / HanIRC:#CN

임수서룬뫼의 이미지
37217
points

2^32는 대략 43억

-1
points

2^32는 대략 43억 정도니까 정재은씨가 INT_MAX(=2^31-1, 2147483647) 혹은 그냥 2^31이랑 혼란했을 가능성이 높군요.
벌써 해당 책의 신빙성이 없어지기 시작합니다.

덧붙이면 지금도 서버급, 아니 워크스테이션만 해도 메모리는 16GB 정도 들어가는데 그때라고 그다지 달랐을 것 같진 않군요.
아무래도 필자가 유닉스의 주요 용도를 잠시 잊어버리셨었나 봅니다.

게다가 저걸 또 메모리 용량이랑은 왜 연관시키나요?
Windows가 2GB, Linux가 3GB 대역에 커널 영역을 잡을 겁니다.
1GB인 제 데스크탑으로는 Linux는 커녕 Windows도 못 돌리겠군요. :)



(전략) 항복 권고를 받은 키탈저 태수 아지엣 사카라는 "항복? 먹는 거냐?"라는 짤막한 답장을 써보냈다. 베로시 토프탈은 행간에서 낄낄거림이 묻어나는 문체로 항복은 먹는 것이 아니라 자신의 미력함을 인정하고 상대에게 굴복하는 것이라는 상냥한 답을 보냈다. 그러자 아지엣 사카라는 "못 먹는 것이면 관심 없다."는 답장을 보냈다.
몽화 대사전 - http://cppig1995.n-pure.net/mh

lsj0713의 이미지
1445
points

[quote="gamja9e"]포인터가 4바이트인 이유는?[/quote]

5
points

gamja9e 씀:
포인터가 4바이트인 이유는?

아래에서 설명하겠지만, 포인터는 '제맘대로의 크기를 가질 수 있습니다.'-_-; 그러나 대체로 해당 환경에서 가장 빨리 접근할 수 있는 크기(혹은 사용할 수 있는 메모리 공간 전체를 가리킬 수 있는 크기)가 선택이 됩니다. 그리고 우리가 흔히 사용하는 32비트 환경(x86 인텔기계)에서는 그 크기가 4바이트(정확히는 32비트)입니다. 그렇기에 포인터의 크기가 4바이트인 것입니다. 먼 옛날 8086, 80286 시절에는 포인터의 크기가 4바이트가 아니었지요.

gamja9e 씀:
그럼 정확한 바이트의 정의는 뭘까요? -_-;;

일단 C99에서는 byte를 다음과 같이 정의하고 있습니다.

인용:

'실행 환경에서 사용하는 기본 character set' 안에 포함된 어떤 문자라도 표현할 수 있는 크기의, 접근할 수 있는 최소 저장 단위

이 정의를 이해하기 위해서는 C99에서는 character set을 source character set과 execution character set으로 나누고 그것들을 다시 basic character set과 extended character set으로 나누어 구분한다는 것을 알 필요가 있습니다.

여기서 source character set과 execution character set을 서로 구분하고 있다는 점이 상당히 재미있는데, 이것은 source code는 ASCII를 사용하고 컴파일 결과물은 EBCDIC로 내놓는 C 컴파일러도 가능하다는 얘기가 됩니다. 뻔한 얘기죠? ^^;; 소스 코드 작성 환경이 아니라 실행 환경을 기준으로 하는 것 또한 역시 뻔한 얘기죠.

참고로 몇가지 더 적자면 C에서는 무조건 sizeof(char) == 1이며, 무조건 CHAR_BIT >= 8 이어야 합니다.

pointer에 대해서는 특별히 따로 정의해 놓진 않았습니다만, pointer to void가 pointer to char와 같은 내부 표현을 가져야 한다는 점을 제외하면 그 내부 표