어떻게 공짜가 얼마를 공짜로 주는지 알 수 있죠?
C 프로그래밍에서는 원하는 어떤 종류의 포인터라도 자유롭게 할 수 있는데, 어떻게 프리할 할당 메모리의 크기를 알 수 있을까요?어떤 함수에 포인터를 넘길 때마다 사이즈를 전달해야 합니다(즉, 10개의 요소로 구성된 배열은 10을 파라미터로 수신해야 어레이 크기를 알 수 있습니다). 그러나 사이즈를 프리 함수에 전달할 필요는 없습니다.왜 안 될까요?또, 어레이 길이의 추가 변수를 이동하지 않아도 되기 때문에, 같은 기술을 독자적인 기능에 사용할 수 있을까요?
했을 때malloc()
이치노실제로 사용되는 메모리의 양은 이보다 약간 많으며 블록의 크기를 기록하는 추가 정보도 포함되어 있습니다.그 외의 정보에 액세스 할 수 없습니다(신뢰할 수 있습니다).또, :-도 액세스 할 수 없습니다.
했을 때free()
블록의 크기를 알아보기 위해 추가 정보를 살펴보기만 하면 됩니다.
C 메모리 할당 함수의 대부분의 구현에서는 각 블록의 계정 정보가 인라인 또는 개별적으로 저장됩니다.
일반적인 방법(인라인) 중 하나는 실제로 필요한 헤더와 메모리를 최소 크기로 패딩하여 할당하는 것입니다.예를 들어 20바이트를 요구하면 시스템은 48바이트 블록을 할당할 수 있습니다.
- 크기, 특수 마커, 체크섬, 다음/이전 블록에 대한 포인터 등을 포함하는 16바이트 헤더.
- 32바이트 데이터 영역(20바이트는 16의 배수로 패딩).
그러면 사용자에게 주어진 주소가 데이터 영역의 주소입니다.그 후 「이러한 블록」가 됩니다.free
그 채우지 않은해, 그에 어카운팅 합니다.그래피컬하게 말하면 다음과 같습니다.
____ The allocated block ____
/ \
+--------+--------------------+
| Header | Your data area ... |
+--------+--------------------+
^
|
+-- The address you are given
헤더와 패딩의 사이즈는 완전히 구현 정의되어 있습니다(실제로는 모든 것이 구현 정의되어 있지만 인라인 어카운팅 옵션은 일반적인 것입니다).
계정 정보에 존재하는 체크섬과 특수 마커는 덮어쓰거나 두 번 해방할 경우 "메모리 아레나 파손" 또는 "더블 프리"와 같은 오류의 원인이 되는 경우가 많습니다.
패딩(할당을 보다 효율적으로 하기 위해)은 문제를 일으키지 않고 요청된 공간의 끝을 조금 넘어 쓸 수 있는 이유이기도 합니다(그래도 그렇게 하지 마십시오. 정의되지 않은 동작이며, 가끔 작동한다고 해서 문제가 발생하지 않는 것은 아닙니다).
(a) 실장을 작성했습니다.malloc
128바이트 이하(NULL 반환값으로 더 많은 요구는 충족됨)를 요구하는 것으로 가정하여 128바이트(시스템에서 가장 큰 구조의 크기)를 취득한 임베디드 시스템의 경우.판단하기 한 비트 인라인가되었습니다.128 바이트 청크가 할당되었는지 여부를 하기 위해 사용되었습니다.
제가 개발한 다른 제품들은 16바이트 청크, 64바이트 청크, 256바이트 청크 및 1K 청크에 대해 서로 다른 풀을 가지고 있으며, 비트 마스크를 사용하여 사용되거나 사용 가능한 블록을 결정합니다.
두 모두 정보의 수 .malloc
★★★★★★★★★★★★★★★★★」free
(해방 시 인접 블록을 통합할 필요가 없음) 작업 환경에서 특히 중요했습니다.
서 comp.lang.c
FAQ 목록:free는 해방되는 바이트 수를 어떻게 알 수 있습니까?
malloc/free 구현은 할당 시 각 블록의 크기를 기억하기 때문에 개방 시 크기를 상기시킬 필요가 없습니다.(일반적으로 크기는 할당된 블록에 인접해 저장됩니다.그 때문에 할당된 블록의 경계가 약간 오버스텝 되어 있는 경우, 통상적으로 문제가 발생합니다.)
이 답변은 "Free()는 할당 해제하는 메모리 양을 어떻게 알 수 있습니까?"에서 재배치됩니다.중복된 질문으로 대답할 수 없게 되어 버린 것입니다.이 답변은 이 중복과 관련이 있을 것입니다.
의 malloc
allocator는 포인터의 합니다.이 매핑은 반환된 포인터를 반환된 포인터와 반환된 포인터를 된 포인터에 필요한 관련 를 포함합니다free
츠키노여기에는 일반적으로 메모리 영역의 크기가 사용 중인 할당자와 관련된 모든 형태로 저장됩니다. 예를 들어, 할당 추적에 사용되는 이진 트리의 노드, 사용 중인 메모리 "유닛"의 수가 포함됩니다.
free
포인터를 "반복"하거나 어떤 방법으로든 복제해도 실패하지 않습니다.그러나 참조는 카운트되지 않으며 첫 번째 항목만 카운트됩니다.free
정확할 것입니다.추가의free
는 "더블 프리" 오류입니다.
시도 중free
이전에 반환된 것과 다른 값을 가진 포인터malloc
s. 아직 unreved는 오류입니다.반환된 메모리 영역을 부분적으로 해방할 수 없습니다.malloc
.
메모리 가 호출했을 때 했습니다.malloc
.
직접 구현한 적은 없지만 할당된 블록 바로 앞에 있는 메모리에는 메타 정보가 포함되어 있을 수 있습니다.
원래 기법은 조금 더 큰 블록을 할당하고 처음에 크기를 저장한 후 나머지 블로그를 애플리케이션에 제공하는 것이었습니다.여유 공간에는 크기가 유지되며 재사용을 위해 빈 블록을 스레드화하기 위한 링크가 있을 수 있습니다.
그러나 이러한 속임수에는 캐시 불량 및 메모리 관리 동작과 같은 특정 문제가 있습니다.블록 내에서 메모리를 바로 사용하면 불필요하게 페이지 삽입이 되기 쉽고, 공유나 카피 온 라이트(copy-on-write)를 복잡하게 하는 지저분한 페이지가 생깁니다.
따라서 더 고급 기술은 별도의 디렉토리를 유지하는 것입니다.메모리 영역이 동일한 두 가지 크기의 거듭제곱을 사용하는 이국적인 접근법도 개발되었습니다.
일반적으로는 상태를 유지하기 위해 별도의 데이터 구조가 할당됩니다.
이와 관련하여 GLib 라이브러리에는 암묵적인 크기를 저장하지 않는 메모리 할당 기능이 있습니다. 그런 다음 크기 매개 변수를 전달하면 해제됩니다.이를 통해 오버헤드의 일부를 제거할 수 있습니다.
malloc()
★★★★★★★★★★★★★★★★★」free()
시스템이나 기능에 의존하기 때문에 구체적인 답변을 드리기는 어렵습니다.
질문의 후반부에 대답합니다.네, 할 수 있습니다.또, C의 꽤 일반적인 패턴은 다음과 같습니다.
typedef struct {
size_t numElements
int elements[1]; /* but enough space malloced for numElements at runtime */
} IntArray_t;
#define SIZE 10
IntArray_t* myArray = malloc(sizeof(intArray_t) + SIZE * sizeof(int));
myArray->numElements = SIZE;
malloc을 호출할 때는 단순히 요구 사항보다 더 많은 바이트를 소비합니다.이 더 많은 바이트 소비량에는 체크섬, 크기 및 기타 추가 정보와 같은 정보가 포함됩니다.그 시점에서 무료 콜을 실시하면, 주소의 추가 정보에 직접 액세스 해, 어느 정도의 블록이 비어 있는지를 확인할 수 있습니다.
에는 '네'라고 하면 '어느 '어느 정도', '어느 정도', '어느 정도'와 같은 을 사용할 수 .malloc()
크기인수를 할 수 .
언급URL : https://stackoverflow.com/questions/1518711/how-does-free-know-how-much-to-free
'programing' 카테고리의 다른 글
초기 값을 HTML에서 직접 사용할 수 있는 vue.js 모델로 설정합니다. (0) | 2022.07.05 |
---|---|
Java에서 sha256으로 문자열을 해시하려면 어떻게 해야 합니까? (0) | 2022.07.05 |
@인터페이스의 메서드 구현을 덮어쓸까요? (0) | 2022.07.05 |
여러 탭을 열 때 Nuxt 브라우저가 충돌합니다. (0) | 2022.07.05 |
Java 형식의 yyy-MM-dd 형식의 달력 날짜 (0) | 2022.07.05 |