programing

재할당 사용과 무료 사용의 차이점 -> malloc 함수

lastmoon 2023. 6. 11. 11:15
반응형

재할당 사용과 무료 사용의 차이점 -> malloc 함수

malloc() 함수를 다시 호출하기 전에 자유() 함수를 사용하는 대신 동적으로 할당된 배열의 크기를 조정하는 이유는 무엇입니까? (예: 장단점, 장점 대 단점 등)C 프로그래밍을 위한 것인데, 적합한 태그를 찾을 수가 없습니다.잘 부탁드립니다.

메모리 관리는 시스템에 따라 다르기 때문에 이 벤치마크는 명확하지 않지만, 요즘에는 표준화된 경향이 있으므로 이러한 결과를 참조 포인트로 사용하는 것이 안전할 것입니다(실제 사례가 아닌 경우에는 알려 주십시오).4GB RAM이 장착된 2.10GHz 쿼드코어 Intel Core i3 2310M에서 Windows 7을 사용하고 있습니다.최고의 하드웨어는 아니지만, 현재 제 주변에 있는 최고의 하드웨어입니다.

이 벤치마크는 일정량의 메모리(INITIAL_MEMORY)로 시작하여 ALLOGATE_MEMORY를 완전히 할당/할당 해제할 때까지 소량(BYTE_STEP)으로 재할당을 반복합니다.이를 위해 6가지 접근 방식을 시도합니다.

  1. Lossful Malloc 증가: free() 및 malloc() 메모리 추가.
  2. Lossful Malloc 감소: free() 및 malloc() 메모리 감소.
  3. Malloc 증가: malloc() 더 많은 메모리, 데이터 복사 및 이전 메모리 사용 가능().
  4. Malloc 감소: malloc() 더 적은 메모리, 데이터 복사 및 이전 메모리 사용 가능().
  5. 재할당 증가: 더 많은 메모리를 재할당()합니다.
  6. 재할당 감소: 재할당() 메모리가 적습니다.

첫 번째 테스트: 2MB로 시작하여 1KB 단계로 ±1MB를 할당합니다.

Increasing Lossful Malloc took 3 ms
Decreasing Lossful Malloc took 5 ms
Increasing Malloc took 1 265 ms
Decreasing Malloc took 744 ms
Increasing Realloc took 316 ms
Decreasing Realloc took 0 ms

보시다시피 memcpy를 사용한 수동 복사는 재할당보다 항상 느립니다. 이 시나리오에서 malloc는 새 메모리를 할당할 수 있으며 모든 할당에서 데이터를 복사해야 하기 때문입니다. 이는 재할당이 실제로 동일한 주소를 재사용하고 경우에 따라 블록 크기를 확장한다는 것을 보여줍니다.따라서 데이터를 유지하려면 재할당을 사용해야 합니다.일을 단순화하기 위해, 저는 이 무손실 malloc 접근법을 계속 테스트하지 않을 것입니다.

다음 테스트로 진행하겠습니다. 32MB 초기 메모리, 16KB 단계로 16MB 할당:

Increasing Lossful Malloc took 4 ms
Decreasing Lossful Malloc took 4 ms
Increasing Realloc took 21 453 ms
Decreasing Realloc took 0 ms

이제 재할당을 늘리는 데 다른 테스트에 비해 많은 시간이 소요된다는 것을 알 수 있습니다.재할당 감소는 1ms에도 미치지 못했습니다.이것은 기억을 유지하고 싶지 않다면 자유->몰록 접근법을 사용해야 한다는 것을 보여줍니다. 그렇지 않나요?다음 결과를 확인하십시오.

Increasing Lossful Malloc took 777 ms
Decreasing Lossful Malloc took 729 ms
Decreasing Realloc took 19 ms

(이 결과들은 너무 가까웠기 때문에 여러 테스트를 실행하여 평균을 산출했습니다.)

확실히 메모리 크기를 줄이는 것이 재할당()을 사용할 때 더 효율적입니다.이는 재할당이 새 메모리 블록을 검색할 필요가 없기 때문일 것입니다. 이전 메모리 블록을 사용하고 축소하기만 하면 됩니다.할당을 많이 사용하는 경우 성능에 큰 차이가 있습니다.

또한, 우리는 증가하는 malloc가 감소하는 malloc보다 약간 느리다는 것을 알 수 있습니다. 기본적으로 둘 다 동일하게 수행하더라도 메모리 블록을 찾아서 할당합니다.이 차이는 아마도 더 큰 블록을 검색할 때 malloc가 더 작은 블록을 검색할 때보다 평균적으로 더 오래 검색해야 하기 때문일 것입니다.예를 들어 30MB 블록이 있는 경우 16MB를 할당하는 malloc이 사용하지만 32MB를 할당하는 malloc은 이를 건너뛰고 계속 검색하고 사용 시간을 초과해야 합니다.이것이 아마도 제 시험에서 결과가 많이 달라진 이유일 것입니다.

결론/TLDR:

  1. 데이터를 유지해야 하는 경우 realloc()를 사용합니다.malloc()/free()를 사용하고 확장데이터를 복사하는 것보다 최대 4배 더 빠릅니다.축소할 때는 10,000-100,000배 더 빠릅니다.수동으로 복사하지 마십시오.
  2. 데이터를 유지할 필요가 없는 경우 malloc()/free()를 사용하여 확장(메모리 크기 증가)하지만 축소(메모리 크기 감소) 시 재할당()을 사용해야 합니다.
  3. 이전 사이즈를 모를 경우(스케일 다운인지 업인지 모를 경우) malloc()/free()를 사용합니다.축소할 때는 relocation()이 최대 40배 빠르지만, 확장할 때는 reallocation()이 최대 7600배 느립니다.프로그램이 몇 가지 큰 할당과 몇 톤의 작은 할당 해제(할당량보다 최대 200배 더 많은 할당 해제)를 수행하지 않는 한 malloc()/free()를 사용해야 합니다.

제 벤치마크 소스는 test.cpp입니다.

장점은 재할당이 메모리의 내용을 보존한다는 것입니다.무료 + malloc를 사용하면 배열의 데이터를 재설정해야 합니다.

다시 할당하면 블록 크기를 변경하거나 새 블록을 할당하여 크기에 맞는 만큼 복사할 수 있습니다.대조적으로 malloc과 free는 함께 새로운 것만 할당할 수 있고, 당신은 당신 자신의 복사를 해야 합니다.

솔직히 재할당은 C++에서 잘 작동하지 않기 때문에 요즘에는 많이 사용되지 않습니다.결과적으로 메모리 관리자들은 이를 위해 최적화하지 않는 경향이 있었습니다.

동적 배열을 만들기 위해 무료() 및 malloc() 호출을 여러 번 하는 프로그램이 있었는데, 가능하면 기존 배열을 다시 사용하여 최적화할 것이라고 생각했습니다.벤치마크는 재할당()이 단순히 무료() 및 malloc()를 호출하는 것보다 평균적으로 느리다는 것을 보여주었습니다.가끔은 커지기도 하고 복사가 필요할 수도 있기 때문에 일리가 있다고 생각합니다.

"malloche 함수를 다시 호출하기 전에 free() 함수를 사용하는 것보다"

기존 배열을 해제하면 모든 내용이 손실되므로 일반적인 의미에서 배열을 "확장"할 수 없습니다.

언급URL : https://stackoverflow.com/questions/1401234/differences-between-using-realloc-vs-free-malloc-functions

반응형