programing

왜 사용 포인터 대신 배열 크기 1?

copyandpastes 2022. 7. 17. 21:17
반응형

왜 사용 포인터 대신 배열 크기 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를 참조해 주십시오.

  1. 이 구조는 해방되어야 하는 여러 할당 대신 단일 메모리 블록으로 간단히 할당할 수 있습니다.

  2. 포인터 자체를 저장할 필요가 없기 때문에 실제로 메모리 사용량이 줄어듭니다.

  3. 또, 메모리가 인접해 있기 때문에, 캐싱의 퍼포먼스상의 메리트가 있는 경우도 있습니다.

에 있는 부분들은data구조 바로 뒤에 있는 기억 속에 들어맞습니다.물론, 당신은 그냥 그렇게 할 수 있습니다.

언급URL : https://stackoverflow.com/questions/6390331/why-use-array-size-1-instead-of-pointer

반응형