보이드의 크기는 얼마입니까?
이 진술은 무엇을 산출할까요?
void *p = malloc(sizeof(void));
편집 : 질문에 대한 확장입니다.
sizeof (void)가 GCC 컴파일러에서 1을 산출하면 1 바이트의 메모리가 할당되고 포인터 p가 해당 바이트를 가리키고 p ++가 0x2346으로 증가합니까? p가 0x2345라고 가정합니다. 나는 * p가 아니라 p에 대해 이야기하고 있습니다.
유형 void
에는 크기가 없습니다. 그것은 컴파일 오류입니다. 같은 이유로 다음과 같은 작업을 할 수 없습니다.
void n;
편집하다. 놀랍게도 sizeof(void)
실제로 수행 은 GNU C에서 컴파일됩니다.
$ echo 'int main() { printf("%d", sizeof(void)); }' | gcc -xc -w - && ./a.out
1
그러나 C ++에서는 다음을 수행하지 않습니다.
$ echo 'int main() { printf("%d", sizeof(void)); }' | gcc -xc++ -w - && ./a.out
<stdin>: In function 'int main()':
<stdin>:1: error: invalid application of 'sizeof' to a void type
<stdin>:1: error: 'printf' was not declared in this scope
GCC를 사용하고 있고 컴파일러 특정 확장을 제거하는 컴파일 플래그를 사용하지 않는 sizeof(void)
경우 1입니다. GCC에는이를 수행하는 비표준 확장 이 있습니다.
일반적으로 void
는 불완전한 유형이며 불완전한 유형에는 sizeof를 사용할 수 없습니다.
하지만 void
유형에 대해 자리에 서 있고, 실제로 값을 물을 수 없습니다. 따라서 메모리에 크기가 없습니다. 의 크기를 얻는 void
것은 정의되지 않았습니다.
void
포인터는 단순히 포인터 의미 언어 구조이다 유형이 지정되지 않은 메모리를.
void 크기를 취하는 것은 GCC 확장 입니다.
void
크기가 없습니다. C와 C ++ 모두에서 표현식 sizeof (void)
이 유효하지 않습니다.
C에서 N1570 6.5.3.4 단락 1을 인용합니다 .
sizeof
연산자 함수 타입이있는 식에 적용되지 않는다 또는 불완전한 형태를 이러한 형태의 괄호 이름 또는 비트 필드 멤버를 지정하는 표현.
(N1570은 2011 ISO C 표준의 초안입니다.)
void
불완전한 유형입니다. 이 단락은 제약 조건입니다 . 즉, 모든 준수 C 컴파일러는 위반 사항을 진단해야합니다. (진단 메시지는 치명적이지 않은 경고 일 수 있습니다.)
C ++ 11 표준은 매우 유사한 표현을 사용합니다. 두 버전 모두이 질문을받은 후에 출판되었지만 규칙은 1989 ANSI C 표준과 최초의 C ++ 표준으로 거슬러 올라갑니다. 사실, 적용되지 않을 수 void
있는 불완전한 유형 의 규칙 은 언어에 sizeof
도입 된 시점까지 정확하게 거슬러 올라갑니다 void
.
gcc에는 1로 취급 되는 확장 이 sizeof (void)
있습니다. gcc는 기본적으로 준수하는 C 컴파일러가 아니므로 기본 모드에서는 경고하지 않습니다 sizeof (void)
. 이와 같은 확장은 C 컴파일러를 완전히 준수하는 경우에도 허용되지만 진단은 여전히 필요합니다.
sizeof()
불완전한 유형에는 적용 할 수 없습니다. 그리고 void
완료 할 수없는 불완전한 유형입니다.
C에서는 sizeof(void) == 1
GCC이지만 이것은 컴파일러에 따라 다릅니다.
C ++에서는 다음을 얻습니다.
'int main ()'함수에서 : 2 행 : 오류 : 무효 유형에 대한 'sizeof'의 유효하지 않은 적용 -Wfatal-errors로 인해 컴파일이 종료되었습니다.
질문의 두 번째 부분 : sizeof (void *)! = sizeof (void)에 유의하세요. 32 비트 아치에서 sizeof (void *)는 4 바이트이므로 p ++가 적절하게 설정됩니다. 포인터가 증가하는 양은 가리키는 데이터에 따라 다릅니다. 따라서 1 바이트 씩 증가합니다.
sizeof (void)는 그 자체로는 의미가 없지만 포인터 수학을 할 때 중요합니다.
예.
void *p;
while(...)
p++;
sizeof (void)가 1로 간주되면 작동합니다. sizeof (void)가 0으로 간주되면 무한 루프에 도달합니다.
대부분의 C ++ 컴파일러는 sizeof(void)
.
C를 컴파일 할 때 gcc는 준수하지 않고 sizeof(void)
1 로 정의하도록 선택했습니다 . 이상하게 보일 수 있지만 근거가 있습니다. 포인터 산술을 할 때 하나의 단위를 추가하거나 제거하는 것은 크기를 가리키는 개체를 추가하거나 제거하는 것을 의미합니다. 따라서 sizeof(void)
1로 정의 void*
하면 바이트 (형식화되지 않은 메모리 주소)에 대한 포인터로 정의하는 데 도움이됩니다 . 그렇지 않으면 p+1 == p when
p 와 같은 포인터 산술을 사용하여 놀라운 동작을 할 수 있습니다 void*
. void 포인터에 대한 포인터 산술은 C ++에서 허용되지 않지만 gcc로 C를 컴파일 할 때 잘 작동합니다.
표준 권장 방법은 char*
이러한 종류의 목적 (바이트에 대한 포인터) 을 사용 하는 것입니다.
sizeof를 사용할 때 C와 C ++의 또 다른 유사한 차이점은 다음과 같이 빈 구조체를 정의 할 때 발생합니다.
struct Empty {
} empty;
Using gcc as my C compiler sizeof(empty)
returns 0. Using g++ the same code will return 1.
I'm not sure what states both C and C++ standards on this point, but I believe defining the size of some empty structs/objects helps with reference management to avoid that two references to differing consecutive objects, the first one being empty, get the same address. If reference are implemented using hidden pointers as it is often done, ensuring different address will help comparing them.
But this is merely avoiding a surprising behavior (corner case comparison of references) by introduction another one (empty objects, even PODs consume at least 1 byte memory).
참고URL : https://stackoverflow.com/questions/1666224/what-is-the-size-of-void
'Development Tip' 카테고리의 다른 글
동일한 프로젝트의 다른 파일에서 형식 / 모듈을 정의 / 사용하는 F # (0) | 2020.11.04 |
---|---|
파이썬은 멀티 프로세서 / 멀티 코어 프로그래밍을 지원합니까? (0) | 2020.11.04 |
React Native에서 네트워크 요청 (디버깅 용)을 어떻게 볼 수 있습니까? (0) | 2020.11.03 |
Google Maps API v3 정보창 닫기 이벤트 / 콜백? (0) | 2020.11.03 |
WPF에서 타이머를 어떻게 생성합니까? (0) | 2020.11.03 |