(빈 구조)의 크기와 (빈 배열을 가진 구조)의 크기의 차이?
다음과 같이 두 가지 구조를 정의합니다.
struct EmptyStruct{
};
struct StructEmptyArr{
int arr[0];
};
int main(void){
printf("sizeof(EmptyStruct) = %ld\n", sizeof(EmptyStruct));
printf("sizeof(StructEmptyArr) = %ld\n", sizeof(StructEmptyArr));
return 0;
}
Ubuntu 14.04, x64에서 gcc (g++) 4.8.4로 컴파일되었습니다.
출력(gcc 및 g++ 모두에 대해):
sizeof(EmptyStruct) = 1
sizeof(StructEmptyArr) = 0
그 이유를 이해할 수 있습니다.sizeof(EmptyStruct)
와 동등한1
그러나 왜 그런지 이해할 수 없습니다.sizeof(StructEmptyArr)
와 동등한0
. 왜 둘 사이에 차이점이 있습니까?
C에서 프로그램의 동작은 구조가 명명된 멤버 없이 정의되면 정의되지 않습니다.
C11- §6.7.2.1:
struct-declaration-list에 직접 또는 익명 구조 또는 익명 결합을 통해 명명된 구성원이 없는 경우 동작은 정의되지 않습니다.
GCC는 확장으로 빈 구조물을 허용하고 그 크기는0
.
C++의 경우 표준은 크기의 객체를 허용하지 않으므로sizof(EmptyStruct)
1의 값을 반환합니다.
길이가 0인 어레이는 표준 C++ ¹에서는 지원되지 않지만, GNU와 GNU에서는 확장으로 지원됩니다.sizeof
연산자가 반환됩니다.0
적용되는 경우에는
1. § 8.5.1-각주 107) C++에는 길이가 0인 배열이 없습니다.
https://gcc.gnu.org/onlinedocs/gcc/Empty-Structures.html
G++는 빈 구조를 마치 타입 Char의 단일 부재를 가진 것처럼 취급합니다.
https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
GNU C에서는 영-길이 배열을 사용할 수 있습니다. 이 배열들은 실제로 가변 길이 객체의 헤더인 구조의 마지막 요소로서 매우 유용합니다.
언급URL : https://stackoverflow.com/questions/45194751/difference-between-sizeofempty-struct-and-sizeofstruct-with-empty-array
'sourcecode' 카테고리의 다른 글
Angular CLI를 로컬로 설치하는 방법(-g 플래그 없이) (0) | 2023.10.25 |
---|---|
실행 중인 도커 구성에서 새 포트 추가 (0) | 2023.10.25 |
관리 페이지에서 탭 메뉴를 만드는 방법 워드 프레스 (0) | 2023.10.20 |
다중 사이트의 WordPress cron을 대체하기 위해 PHP 스크립트가 작동하지 않습니다. (0) | 2023.10.20 |
브라우저에서 뒤로 버튼 클릭 감지 (0) | 2023.10.20 |