이글루스 | 로그인  


C에서 가변 배열(Variable-Length Array)

C에서 가변 배열(Variable-Length Array)

이 글이 적혀있는 곳은 다음과 같습니다.

http://nosyu.pe.kr/1460

 

 

Egloos에서 Textcube로 이사를 하였습니다.

이글루스에 적은 글과 댓글, 트랙백, 이미지 모두를 옮겼습니다.

 

처음에는 이글루스에 글을 보존할 생각이었습니다.

하지만 이글루스에 올린 자료는 미래에 이글루스 회원 모두가 공유할 수 있기에

남겨두는 것만으로도 황당한 일이 발생할 듯싶습니다.

따라서 전체 삭제를 생각하였지만, 인터넷 상의 링크 전부를 수정할 수 없기에

각 글마다 이사한 곳으로 딥링크를 남기고자 하였습니다.

글 읽기에 불편함, 양해 부탁드립니다.

 

 

C에서 가변 배열(Variable-Length Array)

이 글이 적혀있는 곳은 다음과 같습니다.

http://nosyu.pe.kr/1460

by NoSyu | 2008/03/22 23:38 | in Programming | 핑백(1) | 덧글(8)

Linked at NoSyu의 주저리 주저리 :.. at 2008/06/18 23:56

... 기억을 되살리는 정도였습니다. 오히려 그 때 배운 것을 되살리기 위해 구글 검색을 하다가 재미있는 것을 발견한 것이 수업에서 얻은 것이라 할 수 있습니다. 'C에서 가변 배열(Variable-Length Array)' 그 때도 생각했지만, 너무나 시간 낭비라는 느낌이었습니다. 교수님 세 분이 날마다 돌아가면서 얘기를 하시니 서로 중복되는 부분도 있고, ... more

Commented by object at 2008/03/23 02:22
SunOS라면 알파계열 칩이고 RISC 형식이라 대충 읽으니 되네요. st는 Store겠죠. 대충 암호 풀듯이 풀어보니 첫번째 인자가 $i0, 두번째 함수 인자가 $i1에 저장이 되네요.

func:
!#PROLOGUE# 0
save %sp, -128, %sp
!#PROLOGUE# 1
st %i0, [%fp+68]
st %i1, [%fp+72]
st %sp, [%fp-24]

이거는 그냥 stack 조정하고 인자들과 스택포인터를 스택에 저장하는 코드이구요.

ld [%fp+72], %g1
add %g1, 7, %g1
srl %g1, 3, %g1
sll %g1, 3, %g1

이제 %g1 레지스터에 가변인자인 length 값을 읽어오고, 7을 더하고 right shift로 3칸, 다시 left shift로 3칸을 하는데 이거 보니까 alighment하는 거네요. length가 11이라고 하면, 7을 더하면 18, srl 3 (shift right logical)을 하면 2가 되고, 다시 left 3하면 16이 되겠죠. 즉, 11을 가장 가까운 8의 배수에다 정렬 시키는 겁니다. 16만큼 가변배열을 잡는거네요.

sub %sp, %g1, %sp
add %sp, 92, %g1
add %g1, 7, %g1
srl %g1, 3, %g1
sll %g1, 3, %g1
st %g1, [%fp-28]
st %g0, [%fp-20]
st %g0, [%fp-20]

그런다음에 스택을 이 g1에 저장된 배열크기만큼 조정을 하네요. 그 뒤는 잘 모르겠습니다 ㅎㅎ

어찌되었건... 예상할 수 있듯이 스택에다 잡는 것이기 때문에 스택포인터를 조정하는 코드가 있군요. 훌륭한 글입니다!
Commented by L_Psyfer at 2008/03/23 03:55
동적할당의 다른 이름인가 하고 들어왔다가 좋은거 배우고 돌아갑니다 ^^
Commented by NoSyu at 2008/03/23 08:04
/object/
네.. 전에 확인해보니 Big Endian을 쓰고 있더군요.
맞는 듯싶습니다.^^
지금 코드를 다시보니 그렇네요.
왜 저렇게 8의 배수에 맞추는지 모르겠지만, 그건 시스템 프로그래밍 하는 사람에게 물어봐야겠죠.^^;;;
해석 달아주셔서 고맙습니다.
저도 곧 어셈블리를 배워 이해해보겠습니다.^^ㅜㅜ
Commented by NoSyu at 2008/03/23 08:05
/L_Psyfer/
반갑습니다.
저도 object님의 글을 통해 알 수 있었습니다.^^
좋은 것을 얻으셨다니 다행이네요.^^
Commented by object at 2008/03/23 10:12
이건 Endianess와는 전혀 상관이 없는 문제이구요. 8의 배수로 맞추는 건 그냥 메모리 읽기를 최적화 하기 위해서죠. Unaligned data는 읽는데 두 번의 로드가 필요할 수 있거든요. 그래서 메모리 주소들이 8바이트 정도 (아키텍처 마다 달라요) 배수가 되도록 정렬이 되는 겁니다.
Commented by NoSyu at 2008/03/23 10:36
/object/
네.. 맞습니다.^^
다만, RISC가 맞는지 알 수 있는 방법이 없어
Big Endian을 쓰는 것과 Sun OS인 점을 미뤄보아 RISC를 쓰지 않을까 추측했습니다.;;;;

그러고보니 구조체를 만들 때도 정렬을 신경써야한다고 하던데,
여기서는 컴파일러가 해주는군요.^^;;
좋은 덧글 고맙습니다.
Commented by object at 2008/03/23 10:49
그런 뜻이었군요 ㅎㅎ RISC인 것을 제가 안 것은 endianess 때문은 아니구요. 엔디안은 RISC/CISC 뭐 그런 것과는 전혀 상관이 없는 녀석입니다. 그리고 주어진 어셈에서 엔디안니스를 추측할 수도 없어보이구요. 암튼... RISC로 확인할 수 있는 건 간단한데요. 명령어가 간단하면 그냥 RISC 인 겁니다 ㅎㅎ

구조체는 보통 컴파일러가 디폴트 정렬을 해줍니다.
Commented by NoSyu at 2008/03/23 10:52
/object/
네.. 전혀 상관없지만, 제가 매일 접하는 것이 32bit CISC Little Endian이다보니
저 세 개가 동시에 따라다니는 생각을 하고 만 것입니다.OTL...
(아직 저에게는 64bit가 없어요.ㅜㅜ)
명령어가 간단하면 RISC이군요.^^

구조체의 경우도 컴파일러가 디폴트 정렬을 해주는군요.
왠만하면 직접 맞춰라, 비트 필드를 쓸 때 잘해라 등의 얘기를 들은터라
컴파일러가 아직 멀었는가 하는 생각을 했습니다.
저보다 똑똑한 사람들이 만든 컴파일러를 믿어야겠군요.^^;;;
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.

◀ 이전 페이지          다음 페이지 ▶