[c] 왜 C 함수의 크기는 항상 1 바이트입니까?

를 사용하여 함수의 크기를 확인할 때 sizeof()항상 1 바이트를 얻습니다 . 이 1 바이트는 무엇을 의미합니까?



답변

제약 위반이며 컴파일러 가이를 진단 해야 합니다. 그럼에도 불구하고 컴파일하면 프로그램에 정의되지 않은 동작이 있습니다 [실패 모드에 대한 설명을 위해 @Steve Jessop에게 감사하고 일부 컴파일러에서이를 허용하는 이유에 대해서는 @Michael Burr의 답변 참조 ] : From C11, 6.5.3.4./ 1:

sizeof연산자 기능 유형이 식에 적용되지 않는다


답변

이것은 정의되지 않은 동작이 아닙니다. C 언어 표준에서는 sizeof연산자에 대한 제약 조건 위반이므로 함수 지정자 (함수 이름)와 함께 연산자를 사용할 때 진단이 필요합니다 sizeof.

그러나 C 언어의 확장으로 GCC는 void포인터와 함수 포인터 에 대한 산술을 허용 하며, 이는 a void또는 함수 의 크기 를 1. 결과적으로 sizeof연산자는 GCC 를 사용 1하여 void또는 함수를 평가합니다 . 참조 http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html#Pointer-Arith를

GCC에 또는 옵션을 sizeof사용하여 이러한 피연산자와 함께 사용할 때 GCC가 경고를 발행하도록 할 수 있습니다 . 또는 .-pedantic-Wpointer-arith-Werror=pointer-arith


답변

이것은 컴파일러 작성자가 귀신이 당신의 코에서 날아 오르게하는 대신 1의 값을 결정했음을 의미합니다. (사실, 그것은 sizeof우리에게 다음과 같은 표현을 주었던 또 다른 정의되지 않은 사용이었습니다 . “이것이 첫 번째 요구라면 C 컴파일러 자체가 진단을 발행해야합니다. 당신의 프로그램에서 발생하는 진단은 구문 규칙이나 제약의 추가 위반에 대한 추가 진단을 발행 할 수있는 것처럼 (그런데 문서화 된 진단 메시지가 될 수있는) 악마가 당신의 코에서 날아 오르게 할 수도 있습니다. 어떤 이유로 든 선택). ” https://groups.google.com/forum/?fromgroups=#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8J

이것으로부터 컴파일러가 정의되지 않은 구조에 대한 응답으로하기로 결정한 모든 것에 대한 속어 “코 악마”가 있습니다. 1이 경우이 컴파일러의 비강 악마입니다.


답변

다른 사람들이 지적했듯이 sizeof ()는 유효한 식별자를 사용할 수 있지만 함수 이름에 대해 유효한 (정직하고 유효한) 결과를 반환하지 않습니다. 또한 “코에서 나오는 악마”증후군을 유발할 수도 있고 그렇지 않을 수도 있습니다.

프로그램 함수 크기를 프로파일 링하려면 중간 결과 디렉토리 (.obj / .o로 컴파일되거나 결과 이미지 / 실행 파일이있는 위치)에있는 링커 맵을 확인하십시오. 때때로이 맵 파일을 생성하거나 생성하지 않는 옵션이 있습니다. 컴파일러 / 링커에 따라 다릅니다.

함수에 대한 포인터의 크기를 원하면 모두 동일한 크기, 즉 cpu의 주소 지정 단어 크기입니다.


답변