새소식

💻 Programming (프로그래밍)/C++

[C++] 클래스의 메모리 구조

  • -

클래스 메모리 사이즈

class Stack {
private:
	int stack[16];
	int sp;
public:
	Stack():sp(0) {}

	void push(int value) {
		stack[sp++] = value;
	}
	
	int pop() {
		return stack[--sp];
	}
};


int main()
{
	Stack s1;
	Stack s2;

	cout << sizeof(s1) << endl;
	cout << sizeof(s2) << endl;

	cout << &s1 << endl;
	cout << &s2 << endl;

}

임의로 만든 Stack Class 인스턴스의 메모리를 출력해보았습니다.

 

s1, s2는 둘다 int stack[16] , int sp   =   4* 17 = 68byte 가 있다고 나오네요.

 

어? 그러면 int변수만 클래스에 저장되어 있는거 아닌가요?


 

그러면 클래스 속 함수는 어디에 저장되어있을까요?

바로 Data 구역에 Namespace가 Class이름인, 함수로 저장되어 있습니다.

클래스의 인스턴트가 함수를 호출하여서 사용하게 되는 것이죠

 


그러면 인스턴스는 각각 어떻게 구별하죠?

클래스의 함수라기보단 인스턴스의 함수를 작동시켜야 할텐데 말이죠

 

클래스의 인스턴스에는 자기 자신을 가르키는 주소가 있습니다.

그리고 Stack 클래스 함수에는, 각각 Stack* const this 라는, 상수로 된 Stack의 포인터가 숨겨져있죠.

 

이를 통해 함수에게 이 인스턴스는 s1 인스턴트야!! 하면서 알려주게 됩니다.

 

위의 스택 함수의 push() 와 pop()을 예시로 들어볼게요.

void push(Stack* const this, int value){
    this->stack[(this->sp)++] = value;
}

int pop(Stack* const this){
    return this->stack[--(this->sp)];
}

우리는 사실은 이렇게 클래스 함수를 이용하고 있었답니다.

 


이 this 포인터 어떻게 우리가 이용할 수 있을까요?

this 체이닝

class Chain {
private:
	int value;
public:
	Chain(int v = 0) :value(v) {}

	Chain& Add(int v) { 
		value += v;
		return *this;
	}
	Chain& Sub(int v) {
		value -= v;
		return *this;
	}
	Chain& Mul(int v) { 
		value *= v;
		return *this;
	}

	void print() {
		cout << value << endl;
	}
};


int main()
{
	Chain a = 10;

	a.Add(5).Sub(10).Mul(5);

	a.print();
}

요런 클래스가 있다고 해봅시다.

 

각 Add, Sub, Mul 함수는 클래스의 레퍼런스를 반환해줍니다.

 

따라서 ((a.Add(5)).Sub(10)).Mul(5) 요론 순서

 

(((10 + 5) - 10) * 5) 

 

요렇게 멋지고 쿨한 체이닝을 이용 할 수 있습니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.