※ 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;
}
ㆍ 자세히 까보기 위해 디버그를 돌려봤다
ㆍ 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;
}
ㆍ 마찬가지로 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 |