C의 함수의 크기가 항상 1바이트인 이유는 무엇입니까?
함수의 크기를 확인할 때sizeof()
, 우리는 항상 1바이트를 얻습니다.이 1바이트는 무엇을 의미합니까?
제약 위반이므로 컴파일러가 진단해야 합니다.그런데도 컴파일 하는 경우는, 프로그램이 동작을 정의하지 않은 것입니다(@Steve Jessop에 의한 장애 모드의 명확화, 및 일부 컴파일러가 이것을 허가하는 이유에 대한 @Michael Burr의 회답 참조).C11부터 6.5.3.4/1:
그
sizeof
연산자는 함수 타입을 가진 표현식에 적용해서는 안 된다.
이것은 정의되지 않은 동작은 아닙니다.C 언어 표준에서는 다음 명령어를 사용할 때 진단이 필요합니다.sizeof
함수 지정자(함수 이름)가 있는 연산자는 제약조건 위반이므로sizeof
교환입니다.
단, C언어의 확장으로서 GCC는 다음 명령어에 대한 연산을 허용합니다.void
포인터 및 함수 포인터, 이것은 사이즈를 처리함으로써 이루어집니다.void
또는 로서의 기능1
그 결과,sizeof
오퍼레이터가 평가하다1
위해서void
또는 GCC가 있는 기능.http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html#Pointer-Arith 를 참조해 주세요.
GCC가 사용 시 경고하도록 할 수 있습니다.sizeof
이러한 오퍼랜드에 대해서-pedantic
또는-Wpointer-arith
옵션을 GCC로 설정합니다.또는 에러로 할 수도 있습니다.-Werror=pointer-arith
.
그것은 컴파일러 라이터가 당신의 코에서 악마를 날리게 하는 대신 1의 값을 결정했음을 나타냅니다(실제로, 그것은 정의되지 않은 또 다른 사용이었습니다).sizeof
"C 컴파일러 자체는 이것이 당신의 프로그램에서 처음 발생하는 필수 진단이라면 반드시 진단을 발행해야 합니다.그러면 C 컴파일러가 구문 규칙 위반에 대한 추가 진단을 발행하는 것과 마찬가지로 악마가 당신의 코에서 날아오르게 할 수도 있습니다(그런데 문서화된 진단 메시지가 될 수도 있습니다).s 또는 제약사항(또는 그 문제에 대해서는 어떤 이유로든)"https://groups.google.com/forum/?from groups=#!msg/comp.std.c/ycpVKXTZkgw/S2hdTbv4d8J
여기서부터 컴파일러가 정의되지 않은 구성에 대응하여 무엇을 하기로 결정하든 간에 "비속어 악마"라는 용어가 있습니다. 1
이 경우 이 컴파일러의 비음 악령입니다.
다른 사람이 지적한 것처럼 sizeof()는 유효한 식별자를 얻을 수 있지만 함수 이름에 유효한(정확하게 참된 유효한) 결과를 반환하지 않습니다.게다가, 그것은 분명히 "코에서 나오는 악마" 증후군을 일으킬 수도 있고 아닐 수도 있다.
프로그램 함수 크기를 프로파일링하려면 중간 결과 디렉토리(.obj/.o로 컴파일된 디렉토리 또는 결과 이미지/실행 파일이 있는 디렉토리)에 있는 링커 맵을 확인합니다.때때로 이 지도 파일을 생성하거나 생성하지 않는 옵션이 있습니다.컴파일러/링커에 의존합니다.
함수에 대한 포인터 크기를 원하는 경우 모두 동일한 크기, CPU에 있는 주소 지정 단어 크기입니다.
언급URL : https://stackoverflow.com/questions/12259101/why-is-the-size-of-a-function-in-c-always-1-byte
'itsource' 카테고리의 다른 글
vue.js for loop 내의 함수를 호출하여 현재 항목을 전달하려면 어떻게 해야 합니까? (0) | 2022.08.17 |
---|---|
클래스와 인터페이스를 갖춘 Java Generics - 함께 (0) | 2022.08.17 |
너비가 다른 임의의 수의 요소를 래핑을 사용하여 그리드에 정렬 (0) | 2022.08.17 |
Vue.js vuex 모듈 내보내기/가져오기 실패 (0) | 2022.08.16 |
Java에서 개체 배열을 문자열 배열로 변환하는 방법 (0) | 2022.08.16 |