return by index or return by value ?
글쓴이: sleepbysleep / 작성시간: 목, 2006/01/12 - 11:29오전
보통 저의 경우 메모리 누수현상과 거림직함으로 항상 확보된 메모리의 포인터를 넘겨 주어서 아래와 같이 처리 합니다.
typedef struct { double real, imag; } comp;
void comp_prod(comp *c, comp *a, comp *b) {
c->real = a->real * b->real - a->imag * b->imag;
c->imag = a->real * b->imag + b->real * a->imag;
}
그런데 다음과 같이 넘겨 주어도 되더 군요.
제 생각으로는 안되거나 에러가 나야 하는것아닌지 하는 생각이 드네요 보통 리턴 값은 레지스터에 담아서 넘겨 지지 않나요?
이경우 2개의 인자를 동시에 넘겨 주는건 어떻게 생각해야 하나요?
그리고 메모리 이동은 어떻게 되는지 아시는지?
comp comp_prod(comp a, comp b) {
comp c;
c.real = a.real * b.real - a.imag * b.imag;
c.imag = a.real * b.imag + b.real * a.imag;
return c;
}
Forums:
후자가 되기는 하지만, 스트럭쳐가 크면(스트럭쳐에 포함된 구성원이 지금
후자가 되기는 하지만, 스트럭쳐가 크면(스트럭쳐에 포함된 구성원이 지금 2개인데, 한 100개쯤된다면,... 예로는 별로군요... ㅎㅎ) 메모리 전달(값전달)을 위한 파라메터 개수가 많아지므로 비효율적일 수 있습니다.
전자의 경우 포인터 sizeof(포인터)만 파라메터로 넘어갔다가 넘어오니까, 유리한 점이 있습니다.
i386 linux 상의 gcc의 경우 위의 예에서 comp 구조체의 복
i386 linux 상의 gcc의 경우 위의 예에서 comp 구조체의 복사가 일어나긴하지만, 넘어가는 크기는 comp 만한 크기가 아니고 comp에 대한 포인터가 넘어갑니다.
함수 리턴을 위한 공간도 미리 확보하고 포인터를 넘겨주기 때문에 돌아올 때도 포인터만 받아옵니다.
---
http://coolengineer.com
gcc로 해놓을걸 보니.(struct 약간 변경)[code:1]
gcc로 해놓을걸 보니.(struct 약간 변경)
호출하는 a함수 스택 메모리영역에 반환값을 위한 임시변수를 만들고
comp_prod 함수에서 그 임시 변수에 값을 써주는 형태로 되어있더군요.
comp comp_prod 함수내에서는
C 소스를 만들어 본후에
$ gcc -g -Wall -c test.c -o test.o
$ objdump -S test.o
로 확인해 보세요.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
아.. 함수를 호출할때는 복사한 구조체에 대한 포인터를 넘길 필요는 없겠
아.. 함수를 호출할때는 복사한 구조체에 대한 포인터를 넘길 필요는 없겠군요.
---
http://coolengineer.com
댓글 달기