2016-06-21 3 views
-1

안녕하세요, 저는 sizeof를 할 때 C 표준에 메모리 정렬이 필요하다는 것을 알고 있습니다. 하지만 정수 배열조차도 왜 정렬해야하는지 이해하지 못합니다. 내 다음 예를 참조하십시오c 크기가 정수 정렬입니까?

#include <stdio.h> 

struct flexarray { 
    int a[2]; 
    double f; 
}; 

int main(int argc, char** argv) 
{ 
    printf("sizeof (struct flexarray) = %zu\n", sizeof (struct flexarray)); 
    return 0; 
} 

출력이 16 (8) = sizeof(double) 4 = sizeof(int) 때문에 좋은 것입니다.

그러나 내가 변경할 때 int[3] 다음 출력은 24입니다. 내 계산 결과에 따라 20 (= 3 x 4 + 8)이어야하기 때문에 예상 한 바가 아닙니다.

내가 생각할 수있는 유일한 설명은 컴파일러가 패딩 정수를 추가하지만 왜 이런 일이 발생하는지 이해할 수 없다는 것입니다. sizeof(int[3])은 12이며 결국 4 바이트의 배수입니다.

gcc를 사용하여 32 비트 Linux에서 컴파일 중입니다.

Linux 93c9e1096795 3.10.0-327.10.1.el7.x86_64 #1 SMP Tue Feb 16 17:03:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 

아무도 말해 줄 수 없습니까?

+0

"안녕하세요, 저는'sizeof'를 할 때 C 표준에 메모리 정렬이 필요하다는 것을 알고 있습니다 - Ehm, no! 정렬과 관련하여'sizeof'는 무엇입니까? 그들은 처음에는 관련이 없습니다. – Olaf

+0

정렬은 메모리 액세스와 관련됩니다. 구조체 크기에 영향을 미치고 구조체 크기를 다르게하는 것을 제외하면'sizeof' 또는 C 표준과 전혀 관련이 없습니다. –

+0

플랫폼에서 8 바이트 경계에 맞추어 복식을 정렬해야하는 것처럼 들립니다. 그래서 그것을 달성하기 위해'int [3]'배열 뒤에 4 바이트의 패딩을 삽입해야합니다. 충분히 맑은 것 같습니다. –

답변

3

offsetof을 사용하여 클래스 구성원의 위치를 ​​확인하면 컴파일러에서 double 값을 8 바이트 경계로 정렬하려고합니다.

+0

C는 클래스를 지원하지 않습니다. 그리고 정렬을 검사하기 위해서'offsetof'가 아닌'_Alignof' /'alignof'을 사용하십시오. – Olaf