왜 사용 포인터 대신 배열 크기 1?
한 C++오픈 소스 프로젝트에서, 나는 이 참조하십시오.
struct SomeClass {
...
size_t data_length;
char data[1];
...
}
뭐가 그렇게보다는 포인터를 사용해의 장점은 무엇인가?
struct SomeClass {
...
size_t data_length;
char* data;
...
}
사용자 NULL을 볼 수 있지 않으라는 나는 생각할 수 있는 유일한 것은 크기 1배열 버전과 있습니까?
이와 함께 다른 곳에서 그 포인터를 요점은 메모리를 할당할 필요가 없다.
- 연장전 없이 기억 장치 관리
- 기억에 Accesses은 주 기억 장치 캐시(훨씬)가능성이 더 높아질 것이다.
요령이라면, 보다 많은 메모리를 할당하는 것입니다.sizeof (SomeClass)
, 및 를 작성한다.SomeClass*
그걸 가리켜요.그러면 첫 번째 메모리가 사용됩니다.SomeClass
오브젝트 및 나머지 메모리를 사용할 수 있습니다.data
즉, 다음과 같이 말할 수 있습니다.p->data[0]
하지만 또한p->data[1]
할당한 메모리 끝에 도달할 때까지 계속됩니다.
WTF는 막연한 행동에 있어서 이 사용 결과 한분이기 때문에 요소가 있으나, 자신의 배열을 선언하지만, 그것은 마치 액세스가 만들어질 수 있다.때문에 C++에는 대안이 없는 데 이러한 수단(99이"유연한 배열 멤버"라고 불리었다)을 수립하다 그러나 진정한 컴파일러에서 예상되는 의미와 함께 이 허용한다.
이것은, C++보다 스타일리시하지만, 복수의 메모리 할당이나 할당 해제를 회피하기 위한 빠른(더러운) 방법입니다.
즉, 이것 대신:
struct SomeClass *foo = malloc(sizeof *foo);
foo->data = malloc(data_len);
memcpy(foo->data,data,data_len);
....
free(foo->data);
free(foo);
다음과 같은 작업을 수행합니다.
struct SomeClass *foo = malloc(sizeof *foo + data_len);
memcpy(foo->data,data,data_len);
...
free(foo);
이렇게 하면 할당 호출을 저장(해제)할 뿐만 아니라 포인터를 위한 공간이 없고 구조 패딩일 수 있는 공간도 사용할 수 있으므로 메모리도 약간 절약할 수 있습니다.
이 예에서는, 의미적으로 다릅니다.
char data[1]
는 스택에 1개의 미초기화 요소가 할당되어 있는 유효한 char 배열입니다.글을 쓸 수 있다data[0] = 'w'
그리고 당신의 프로그램이 맞을 것입니다.
char* data;
는, 유효한 주소를 가리키도록 초기화할 때까지 무효인 포인터를 선언합니다.
일반적으로 이것은 구조체의 최종 멤버로 볼 수 있습니다.그럼 누구라도malloc
구조체는 구조체를 따르기 위해 메모리 내의 모든 데이터 바이트를 1개의 블록으로 연속적으로 할당합니다.
따라서 16바이트의 데이터가 필요한 경우 다음과 같은 인스턴스를 할당합니다.
SomeClass * pObj = malloc(sizeof(SomeClass) + (16 - 1));
그러면 데이터가 배열인 것처럼 액세스할 수 있습니다.
pObj->data[12] = 0xAB;
물론 한 번의 통화로 모든 것을 자유롭게 할 수 있습니다.
data
기존 C 컴파일러(및 현재의 C++ 표준)에서는 제로 사이즈 어레이를 사용할 수 없기 때문에 member는 관례상 단일 아이템 어레이입니다.자세한 내용은 http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html를 참조해 주십시오.
이 구조는 해방되어야 하는 여러 할당 대신 단일 메모리 블록으로 간단히 할당할 수 있습니다.
포인터 자체를 저장할 필요가 없기 때문에 실제로 메모리 사용량이 줄어듭니다.
또, 메모리가 인접해 있기 때문에, 캐싱의 퍼포먼스상의 메리트가 있는 경우도 있습니다.
에 있는 부분들은data
구조 바로 뒤에 있는 기억 속에 들어맞습니다.물론, 당신은 그냥 그렇게 할 수 있습니다.
언급URL : https://stackoverflow.com/questions/6390331/why-use-array-size-1-instead-of-pointer
'programing' 카테고리의 다른 글
Vuex 및 Axios를 사용한 Vuej에서의 오류 처리의 베스트 프랙티스 (0) | 2022.07.17 |
---|---|
Valgrind에 의해 아직 도달 가능한 누출이 감지됨 (0) | 2022.07.17 |
Java Streams가 일회성인 이유는 무엇입니까? (0) | 2022.07.13 |
v-on 핸들러 오류: "ReferenceError: i18n이 정의되지 않았습니다." (0) | 2022.07.13 |
Vue JS: 데이터 반환 내부의 값을 업데이트하는 방법 (0) | 2022.07.13 |