call by value

함수에서 값을 변경해도 원래의 값에는 변화가 없다.

원래의 변수의 값을 보존할 때 사용한다.

call by reference

함수에서 값을 변경시 값이 변한다.

원래의 변수를 변화시키고자 할때 사용한다.

c언어에서의 관점

c언어에서는 call by reference 가 call by pointer와 동일하다

둘다 주소를 넘겨준다는 관점이 동일하기 때문이다.

보통 매개변수에 & 를 붙여 call by reference임을 알지만 c에서는 컴파일이 불가능하다.

따라서 그냥 pointer로 써 매개변수를 받으면 이를 c 에서는 call by reference라 일컫는다.

c++에서의 관점

c++에서는 call by reference가 위에서 설명한것처럼 & 이런식으로 매개변수를 받으면 바로

call by reference이다.

메모리적 관점

int func(int a, int b)
{
int i;
a=10;
b=10;
return i+a+b;
}

위와 같이 call by value가 있다고 가정하여보자

main에서 a,b의 공간이 1,2라고 가정시

func 함수에서 a와 b의 공간은 100,200으로 새로 생기게 된다.

계속해서 변화된 값을 받아들이는 함수의 경우 매번 변수를 생성하면 메모리 누수가 생기게 된다.

메모리 누수가 생기면 불필요한 메모리공간을 잡아먹게 된다. 물론 함수가 끝나면 사용된 메모리 는 초기화 된다.

inode

그렇다면 유닉스에서의 저장방식은 어떠할까???

inode 방식을 사용한다.

inode는 파일이나 디렉토리의 정보를 가지고있는 자료구조를 말하며 64byte로 구성된 표이다.

즉 어떤 한 파일이나 디렉토리가 생성되면 하나의 inode가 생성된다. 그리고 이는 inode

list라는리스트에 등록된다. 그리고 숫자가 할당되는에 이를 inumber라 일컫는다.

inode표에는 다음과같은 내용이 들어있다.

소유권, 이용여부, 디스크 내부의 물리적 주소, 파일 수, 파일의 형태 및 크기, 수정시간 등

유닉스의 디스크는 일정한 크기의 블록으로 나누어져 있다. 또한 저장이 될때 그 블록에 할당이

되며 inode에 그 블록의 물리적 위치가 저장되는 것이다. 블록은 0~13번까지 있다.

  • 직접 어드레싱

블록의 0~9까지는 직접 어드레싱이다 즉 각필드의 내용은 주소를 포함한다. 유닉스내 파일은

크기가 작기때문에 이정도로 충분하지만 방대한 파일의 경우 간접어드레싱을 이용한다.

  • 간접 어드레싱

블록 10 - 1차 간접 어드레싱이다. 실제 주소가 있는곳을 가리킨다.

11 -2 차 간접 어드레싱이다. 이중간접 어드레스를 지정한다.

12-3차 간접 어드레싱으로 삼중 어드레스를 저장한다.

+ Recent posts