C++프로그래밍/C 와 C++ 기초실습

포인터 실습 해보기 (일반return과 포인터를 이용한 원본객체 조정)

season97 2024. 9. 17. 22:15

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로

C++에 대한 구체적인 정보를 담고 있지 않습니다.

 


▶ 포인터를 이용해 원본 객체를 사용하는 것과 아닌것의 차이점을 실습으로 알아봤다.

#include <iostream>
using namespace std;


struct StatInfo
{
	//offset은
	int hp; // 0
	int attack;//4
	int defence;//8
}; //4byte3개 12

void EnterLoby();
StatInfo CreatePlayer();				// 일반버전
void CreateMonster(StatInfo* info);		// 포인터를 이용한 버전
int main()
{
	EnterLoby();
}

void EnterLoby()
{
	cout << "로비에 입장했습니다" << endl;

	StatInfo player;			//return을 뱉는 버전
	player.hp = 0xbbbbbbbb;
	player.attack = 0xbbbbbbbb;	//테스트를위해 똥값넣기
	player.defence = 0xbbbbbbbb;

	player = CreatePlayer();	

	StatInfo monster;			//포인터를 이용한 버전
	monster.hp = 0xbbbbbbbb;
	monster.attack = 0xbbbbbbbb;
	monster.defence = 0xbbbbbbbb;
	CreateMonster(&monster); //원본으로 작업
}

ㆍ 실습을 편하게 하기 위해 똥값을 우선 넣어줬고, 읽는데 무리가 없는 아주 쉬운 코드이다.

 

▶ return을 뱉는 버전

StatInfo CreatePlayer()
{
	StatInfo ret; 

	cout << "플레이어 생성" << endl;
	
	ret.hp = 100;
	ret.attack = 10;
	ret.defence = 2;

	return ret;
}

ㆍ 자세히 까보기 위해 디버그를 돌려봤다

&player로 플레이어 주소안의 값 확인

ㆍ bbbbbbbbb.. 똥값 잘 들어가있다

ㆍ 디버그를 계속 돌려 CreatePlayer() 함수 내부로 들어가 return 하는 부분까지 어셈블리로 확인해 봤다.

※ 굉장히 복잡해 보인다... 포스팅으로 요약+해석하자면

ㆍ [매개변수][return][지역변수(temp(100, 10, 2), player(b, b, b)] [매개변수][return][지역변수 (ret (100,10,2))]

1. ret을 생성해 값 할당

2. ret의 값을 temp를 만들어 복사후 임시 저장해둠

3. 저장된 값으로 player의 info에 옮겨줘서 최종적으로 완성해줌

 

※ 내부적으로 복사가 많이 일어나는걸 확인할 수 있다. (비효율적임), 만약 Player의 정보가 어마어마하게 많았다면 성능에 큰 영향을 끼쳤을것이다 


 

▶ 포인터를 이용한 버전

void CreateMonster(StatInfo* info)
{
	cout << "몬스터 생성" << endl;
	info->hp = 40;
	info->attack = 8;
	info->defence = 1;
}

&monster 메모리

ㆍ 마찬가지로 bbbbbb...가 잘 들어가있다

 

ㆍ 어셈블리를 까보자

ㆍ 복사 하는 과정이 하나도없이 바로 짧고간단하게 원본객체를 조절해주고 있는 모습이다!

요약 + 느낀점

더보기

ㆍ [매개변수][return][지역변수(monster 40 ,8 , 1)][매개변수 (&monster)][return][지역변수]

 

아니 저 위에방법은 어셈블리 확인했을 떄 막 temp에 복사해서 이동하고 그런 복잡한 과정이 있었는데 이건 바로   몬스터의 주소에 접근해서 값을넣어주고있다. temp는 존재하지도 않는다.
말로만 효율효율 알고있었는데 어셈블리까보고 메모리 보고 하니까 뭔느낌인지 딱알겠네


 

▶ 구조체끼리 복사하면 무슨일이 벌어질까?

player = monster;

ㆍ 각각 12바이트였으니 12바이트가 복사되나..? 근데 어셈블리엔 그런거없엇다
  C++관점에선 그냥 한번에 하는것 같아 보이지만 내부적으론..
  player.hp = monster.hp;
  player.attack = monster.attack;
  player.defence = monster.defence;
  이거 3개 다 들어가고있는거다.! 복사가 들어가고 무겁단소리다

'C++프로그래밍 > C 와 C++ 기초실습' 카테고리의 다른 글

포인터와 참조타입 비교,차이 (const pointer)  (0) 2024.09.18
참조타입  (0) 2024.09.18
포인터 연산  (0) 2024.09.17
포인터  (0) 2024.09.17
스택 프레임과 호출스택 (디버그)  (2) 2024.09.16