2014-12-09 3 views
2

크기가 0 인 배열을 처리하는 코드를 조사하고있었습니다.정렬은 0 크기 배열에 대한 포인터와 어떻게 작동합니까?

struct _EventGroup { 
    int size; 
    const char* name[0]; 
}; 

I는 GCC 4.1을 사용하여,이 놀아 하였다 : 즉, 그들은 특이 적 https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

같이 구조체의 동적 할당 사이즈의 경우에 사용되며, 이것은 Callgrind의 코드이다. 64 비트 레드햇에 2,은 이름 필드가 포인터 때 를 sizeof 기능은 전체 구조체 _EventGroup에 대한 8 바이트의 크기를 반환 것으로 나타났습니다. GCC는 어떤 공간을 차지하지 않은 경우와 0 크기 배열, 4 바이트를 차지과 INT를 식별하기 때문에 나는 4 바이트을 얻을

struct _EventGroup { 
    int size; 
    const char name[0]; 
}; 

: 지금은 그것으로 변경합니다. 그건 의미가 있습니다.

struct _EventGroup { 
    int size; 
    const char* name; 
}; 

를 sizeof 반환 16 바이트 숯불이 * 64 비트 시스템에서 8 바이트 소요되며 INT는 8 바이트로 패딩 얻을 수 있기 때문에 : 그때로 변경합니다. 이것은 의미가 있습니다. 내가 마지막으로 변화 할 경우 지금 :

struct _EventGroup { 
    const char* name[0]; 
}; 

을 GCC 내 크기가 0 인 배열을 검출하기 때문에 나는 0 바이트를 얻을. 내가 분명히 밝히고 싶은 것은 제가 제시 한 첫 번째 경우에서 일어나는 일입니다. 0 크기 배열에 대한 포인터에 gcc가 얼마나 많은 공간을 할당하고 있으며 그 이유는 무엇입니까? 이 코드는 메모리 할당을 효율적으로하기 위해 설계 되었기 때문에 gcc가 포인터를 0 바이트 크기로 지정하면 본질적으로 아무 것도 가리 키지 않거나 8 바이트로 처리됩니다. 정상적인 포인터. 정렬은 필자의 원래 구조체로 4 바이트 또는 16 바이트를 얻도록 지시합니다. 왜 나는 8 바이트를 얻는가?

+0

0 크기의 배열은 G의 확장이 아니고 C의 일부가 아니다. 당신은 동적으로 할당 된 메모리 이외에는 이런 식으로 구조체를 사용하지 않아도된다는 것을 명심하라. "0 바이트"는 의미가있다. 실제 배열 앞의 전문에 대해서는 0 바이트로 생각하면됩니다. –

+0

이 줄은 : const char * name [0]; char * 엔트리의 배열을 정의하고있다. 그 중 0/none이있다. – user3629249

+0

나는 그 부분을 얻지 만, 나의 질문은 특히 gcc에서 시행되는 정렬에 관한 것이다.char * name [0]을 int로 선언하면 분명히 0 바이트에서 4 바이트까지 패딩됩니다. 그냥 char name [0] 인 경우 0 바이트에서 0 바이트로 패딩됩니다 (전혀 패딩되지 않음). 왜 포인터가 다르게 취급되는 경우입니까? 포인터처럼 취급되고 있다면 8 바이트가 될 것이라고 가정합니다. –

답변

4

Gcc는 올바른 채우기 패딩을 추가하여 배열에 실제로 여분의 공간을 할당하면 &(eventGroup->name) 포인터가 올바르게 정렬됩니다.

그것은 당신이 4 바이트의 int와 8 바이트 포인터가있는 플랫폼에있어 보인다, 그래서 이것은 당신이 의미 : 제로 크기의 배열이 실제로 이래로

bytes 0-3 -- the int 
bytes 4-7 -- padding 
bytes 8-15 -- where the first (char *) would be stored, 8-byte aligned 

, 당신은하지 않습니다 실제로는 그 첫 번째가 char *이지만, 을 수행하면에 패딩이 있습니다. 따라서, 구조체가 두 번째 예에서 8

크기를 가지고, 거기에 1 바이트 문자에 대한 정렬 요구 사항입니다, 그래서 당신은 : 다시

bytes 0-3 -- the int 
byte 4  -- where the first (char) would be stored, "1-byte aligned" 

, 구조체의 실제 char, 그래서 그것은 크기가 4이다.