왜 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의 주소 지정 단어 크기와 같은 크기입니다.
참고 URL : https://stackoverflow.com/questions/12259101/why-is-the-size-of-a-function-in-c-always-1-byte
'IT박스' 카테고리의 다른 글
정규식은 정확히 n 또는 m 회 (0) | 2020.09.12 |
---|---|
sqlite3.ProgrammingError : 8 비트 바이트 열을 해석 할 수있는 text_factory를 사용하지 않는 한 8 비트 바이트 열을 사용해서는 안됩니다. (0) | 2020.09.12 |
git 하위 모듈을 다른 저장소로 어떻게 바꾸나요? (0) | 2020.09.12 |
varchar (8000)보다 varchar (500)의 장점이 있습니까? (0) | 2020.09.12 |
쉘에서 10 개 이상의 매개 변수를 처리하는 방법 (0) | 2020.09.12 |