2014-08-27 2 views
2

구조 내부에서 가변 길이 배열을 사용하는 가장 좋은 방법은 무엇입니까? 는 GCC 4.8과 x86_64의 기계에 길이가 0 인 배열로 구조 패딩

typedef struct foo_s { 
    uint32_t data_type; 
    uint16_t data_len; 
    uint8_t data[]; 
} foo_t; 

말해, 난 거기에 차이 DATA_LEN 후 패딩이 있지만, 패딩이 구조가 같은

sizeof(foo_t) == 8, but 
offsetof(foo_t, data) == 6 

보이는 얻었다. 이 문제를 피하기 위해 항상 가장 큰 회원을 유지해야합니까? 즉

typedef struct foo_s { 
    uint16_t data_len; 
    uint32_t data_type; 
    uint8_t data[]; 
} foo_t; 

var len 배열을 사용하는 가장 좋은 방법은 무엇입니까?

+1

구조체가 배열의 요소 일 때 uint32_t를 계속 정렬해야하기 때문에 sizeof가 8을 반환합니다. 물론 ** 배열에 저장하지 않을 것이므로 무시하십시오. malloc을 호출하면 offsetof() + 배열 크기 만 사용됩니다. –

답변

1

data을 4 바이트로 정렬해야하는 특별한 이유가 없으면 (그렇다면 왜 uint8입니까?) 첫 번째 바이트는 2 바이트를 절약하기 때문에 약간 바람직합니다. 이와 같은 가변 길이 구조의 경우 정확히에 의해보고 된 값은 실제로는 관련이 없습니다. sizeof(foo_t) + data_len 바이트를 할당하기로 결정했다면 2 바이트를 낭비하게되지만 어쨌든 두 번째 구조 정의에서 패딩 할 때 낭비하게됩니다.

+0

예, 사용자가 여러 가지 방법으로 크기를 계산할 경우, 특히 버퍼에 압축 된 foo_t 배열이있는 경우 정렬에 대해 너무 걱정하지 않습니다. – wei

+0

버퍼에 전체 배열이 있다면 어쨌든 할당을 채워야하므로 첫 번째 형식으로 갈 이유가 더 있습니다. – Sneftel

+0

"할당을 채울 필요가 있습니다"에 대해 더 자세히 설명해 주시겠습니까? 고맙습니다. – wei

1

정렬을 희생하지 않고 구조체를 패킹하려면 yes를 선택하십시오. 가장 좋은 방법은 요소를 감소 또는 증가 순서로 정렬하는 것입니다. 배열은 마지막 요소 여야하므로 가장 좋은 옵션은 감소하는 주문입니다. 크기가 작고 구조체 배열이 큰 경우에만 중요하지만 유연한 배열 멤버를 사용하면 구조체의 배열).

관련 문제