작성
·
223
·
수정됨
0
안녕하세요 강의 수강 중에 궁금한 점이 있어 문의 남깁니다.
6분 34초를 보면 포인터의 사이즈는 8바이트라고 나오는데, 그 전에 나온 포인터 값을 보면 16진수 12자리 값이어서 6바이트 크기인 것으로 보입니다.
이 부분에서 왜 차이가 발생하는지 궁금합니다.
추가적인 질문이 있습니다.
int가 4바이트고 int *가 8바이트면 메모리 효율성에서 매우 비효율 적인 것이 맞나요?
물론 포인터가 매개변수 호출 등에서 장점이 있긴 하지만, 효율성 부분에서 안좋은 것 아닌지 하는 궁금증이 생겨서 여쭤봅니다.
항상 좋은 강의 감사합니다.
답변 1
0
안녕하세요 주환님 ㅎㅎ
6바이트
>> 혹시 코드 공유가능하실까요?
포인터의 크기는 다음과 같이 간단하게 구할 수 있습니다.
#include <iostream>
int main() {
std::cout << "int* 의 사이즈 : " << sizeof(int*) << " bytes";
return 0;
}
한번 돌려보시겠어요? 8바이트로 나오는 것을 확인할 수 있습니다. ( 64비트라면.)
비효율적
>>
음.. 3가지 이유에서 비효율적이지 않다. 라고 할 수 있는데요.
포인터의 필요성과 메모리절약: 포인터는 메모리 주소를 저장하고, 이를 통해 다양한 메모리 관리 기법과 데이터 구조를 구현하는 데 필수적입니다. 예를 들어, 동적 할당, 연결리스트, 트리, 그래프 등을 만들 때 포인터 없이 만들기가 어렵습니다. 예를 들어 노드와 노드가 연결되어있다라는 것을 표현할 때 포인터를 많이 넣는데요.
다음과 같이 표현하기도 하죠.
class Node {
public:
int data;
Node* next;
};
이 때 포인터가 없다면.. 해당 Node를 복사하고.. 복사하는 일이 발생할 것입니다. 즉, 포인터를 사용함으로써 메모리를 절약할 수 있습니다. 예를 들어, 큰 데이터 구조관련 struct를 만들 때나 큰 데이터를 여러 함수에 전달할 때 포인터를 사용하면 해당 데이터의 복사본을 만들 필요가 없어 메모리 사용량이 줄어듭니다.
64비트 시스템에서의 포인터 크기: 대부분의 현대 컴퓨터 시스템은 64비트이며, 이 경우 포인터 크기는 보통 8바이트입니다. 이는 해당 시스템에서 표현할 수 있는 주소 범위를 의미합니다. 예를 들어 32비트라면 2^32만큼만 표현이 가능합니다. 하지만 64비트라면 2^64 비트만큼 표현이 가능하죠. 즉, 64비트 - 8비트로 하는게 좀 더 좋다고 볼 수 있습니다. 예를 들어 1비트짜리라면 0, 1 두가지를 표현할 수 있죠? 2비트라면.. 00, 01, 10, 11밖에 표현을 못하죠? 이렇듯 8비트라면 컴퓨터가 표현할 수 있는 가짓수가 많아져서 더 좋습니다.
참고로 정확하게는.. 대부분의 64비트 시스템에서는 모든 64비트 주소를 사용하지 않습니다. 예를 들어, 많은 64비트 시스템에서는 주소 공간의 상당 부분을 시스템이 사용하는 데 예약되어 있으며, 실제 사용 가능한 메모리 주소 범위는 시스템에 따라 다릅니다. 예를 들어, 리눅스, 윈도우, macOS 같은 현대 운영 체제들은 다양한 이유로 실제 사용 가능한 주소 공간이 이론적 최대치보다 작습니다.
3. 비효율성의 상대성: 물론... 어떤 프로그램이 작은 int
값들만 다루고, 이를 위해 대량의 포인터를 사용한다면, 그 경우에는 메모리 효율성이 낮아질 수는 있습니다. 하지만 이런 케이스만 있는 것은 아니니까요. ㅎㅎ
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.