• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

동적 2차원 배열 생성 시 연속된 메모리 할당 여부

24.01.16 23:00 작성 조회수 205

1

안녕하세요. 강의를 듣고 난 후 메모리 상에서 row간에 인접한 주소를 가지는지, 즉 2차원 배열의 원소 전체가 메모리 상에서 연속되어 있는지 궁금하여 아래와 같이 작성한 후 실행해 보았습니다.

 

int** matrix = new int* [row];

cout << intptr_t(&matrix[0]) << endl;
cout << intptr_t(&matrix[1]) << endl;
cout << intptr_t(&matrix[2]) << endl;
cout << endl;

for (int r = 0; r < row; r++) {
	matrix[r] = new int[col];
}

cout << intptr_t(matrix[0]) << endl;
cout << intptr_t(matrix[1]) << endl;
cout << intptr_t(matrix[2]) << endl;
```

x64로 빌드하였고, 각 row를 가리키는 포인터의 주소는 8 바이트씩 연속되어 있는것을 확인하였습니다. 하지만 각각의 row 의 첫 원소의 주소끼리는 간격이 일정하지 않았고, 여러 번 테스트를 해보니 row간의 주소가 증가하다 감소하는 경우도 있었기에 정적 배열과 달리 메모리가 연속되어있지 않다고 결론내렸습니다.

 

그런데 주소 사이의 간격이 과도하게 멀어지는것 같지도 않았기에 아래 그림과 같이 약간 느슨하게(?) 가까이 있는 느낌이 들었습니다.

 

C++에서 new 키워드를 사용해서 메모리를 할당할 때에 무언가 법칙이 있는것 같은데, 위 코드처럼 연속적으로 메모리를 할당받는 경우에는 가능한 한 가까운 주소에 할당해주는 건가요?

 

답변 1

답변을 작성해보세요.

2

Soobak님의 프로필

Soobak

2024.01.16

안녕하세요, 답변 도우미 Soobak 입니다.

 

좋은 궁금증이시네요.


말씀하신 것처럼, 다차원 배열 동적 할당에서, 각 row 를 위한 int[col] 배열을 할당할 때, 각각의 배열은 힙 메모리의 다른 부분에 할당됩니다.
이와 관련하여, 메모리 단편화를 줄이고, 캐시 메모리의 효율성을 높이기 위해 메모리 동적 할당은 할당된 블록들이 가능한한 붙어있도록 할당됩니다.
그렇기 때문에 연속적으로 new 를 호출하면, 할당된 메모리 블록들이 상대적으로 가까운 주소를 가지게 되는 경우가 많습니다.

하지만, 무조건 적으로 보장되는 동작은 아니며, 시스템의 메모리 사용 상황, 운영체제의 메모리 관리 정책, 프로그램이 이전에 할당하고 해제한 메모리의 양과 패턴 등 다양한 요인들에 의해 영향을 받습니다.
따라서, 주소가 증가하기도 하고 감소하기도 하는 것을 관찰하실 수 있는 것입니다.

durams님의 프로필

durams

질문자

2024.01.16

빠른 답변 감사합니다. 예상했던 것하고 비슷하니 더 재밌네요.