2010-08-19 5 views
2

C에서 동적 배열을 어떻게 할당해야합니까? 현재 내가 쓴 기능은 다음과 같습니다 그 malloc2D라는이 : 그것은 그러나 잘 작동C의 동적 2D 배열 할당

void* malloc2D(size_t unitSize, uint firstCount, uint secondCount) 
{ 
    void** pointer = malloc(sizeof(id) * firstCount); 
    for (int i =0; i < firstCount; i ++){ 
     pointer[i] = malloc(unitSize * secondCount); 
    } 
    return pointer; 
} 

내가 별도로 할당 메모리의 부담을 많이두고 있다고 들었습니다. 이 작업을 수행하는 가장 좋은 방법 또는 가장 일반적인 방법은 무엇입니까?

답변

0

배열을 이와 같이 연속 된 블록으로 할당 할 수 있습니다. 당신의 int를한다고 가정 : 코드가 정말 필요가 없다는 아주 간단하지만

int (*arr)[secondCount] = malloc(sizeof(int[firstCount][secondCount])); 

당신은, 매크로 인수로 유형 이름을 소요 매크로 뒤에이를 숨길 수 있습니다.

5

는 한 번에 전체 블록을 할당 할 수 있습니다 :

int ** foo; 

foo = malloc(sizeof(int*) * firstCount); 
foo[0] = malloc(sizeof(int) * firstCount * secondCount); 
for (int i=1; i<firstCount; i++) 
{ 
    foo[i] = foo[0] + i * secondCount; 
} 
+0

나는 그런 식으로 생각하지 않았다 ... –

3

나의 제안은 당신이 무엇을 유지하는 것입니다.

  1. 이미 개발되었습니다.
  2. 테스트되었습니다.
  3. 매크로를 사용하지 않고도 직관적이거나 읽기 쉽습니다.
  4. 확장 가능합니다.
  5. 병목 현상이 정량적으로 확인되지 않았습니다.

때때로 문제가없는 경우 최적화를 시도하면 성능이 저하 될 수 있습니다. 친구 이론에 대한 벤치마킹을 해봤습니까?

malloc 큰 덩어리를 생성하려면 인접한 주소 공간을 찾아야하며 현재 방법 (address space fragmentation 등)이 성공하면 malloc이 실패 할 수도 있습니다.

현재 구현이 확장 가능하다고 말했을 때 크기를 조정하는 것이 쉽다는 것을 의미합니다. [100] [3]을 할당하고 나중에 [100] [4]가 필요하다는 것을 알았다면 100 매우, 아마도 주소를 변경하지 않을 가능성이 있습니다. 그러나 매크로 메서드를 크기 조정해야 할 경우 연속적으로 존재하지 않을 수있는 전체 청크가 realloc이어야합니다. 더 나쁜 것은 수학이 바뀌었기 때문에 데이터가 더 이상 매크로에 액세스 할 수 없기 때문에 일련의 비싼 값이 필요합니다. memmove s.

일반화하기 위해 항상 가독성, 유지 보수성 및 사용 용이성을 염두에두고 코딩하는 것이 중요하며 병목 현상을 확립 한 후에는 최적화하는 것이 중요하다고 생각합니다.

+0

좋아, 좋아. –

+0

기존 코드의 문제점은이를 사용하는 방법입니다. int의 배열이되는 것을 의미한다고 가정 해 봅시다. 올바른 호출 코드는'void ** arr = malloc2D (sizeof (int), N, M)와 비슷할 것이다. int a = ((int *) arr [x]) [y]'. 나는 사람들이'int ** arr = malloc2D (sizeof (int), N, M);을 쓰려고 시도 할 것 같은 느낌이 들지 않는다. 이것은 정의되지 않은 행동을 일으킨다. –

+0

기존의 큰 코드베이스에서는 잠자는 개가 거짓말을하는 것이 낫다는 말입니다. –