안녕하세요, 저는 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
아무도 말해 줄 수 없습니까?
"안녕하세요, 저는'sizeof'를 할 때 C 표준에 메모리 정렬이 필요하다는 것을 알고 있습니다 - Ehm, no! 정렬과 관련하여'sizeof'는 무엇입니까? 그들은 처음에는 관련이 없습니다. – Olaf
정렬은 메모리 액세스와 관련됩니다. 구조체 크기에 영향을 미치고 구조체 크기를 다르게하는 것을 제외하면'sizeof' 또는 C 표준과 전혀 관련이 없습니다. –
플랫폼에서 8 바이트 경계에 맞추어 복식을 정렬해야하는 것처럼 들립니다. 그래서 그것을 달성하기 위해'int [3]'배열 뒤에 4 바이트의 패딩을 삽입해야합니다. 충분히 맑은 것 같습니다. –