Почему размер функции в C всегда 1 байт?

Когда мы проверяем размер функции с помощью sizeof(), мы всегда получаем 1 байт. Что означает этот 1 байт?

Ответ 1

Это нарушение ограничения, и ваш компилятор должен его диагностировать. Если он ее компилирует, несмотря на это, ваша программа имеет поведение undefined [благодаря @Steve Jessop для выяснения режима сбоя и см. @Michael Burr answer почему некоторые компиляторы разрешают это]: С C11, 6.5.3.4./1:

Оператор sizeof не применяется к выражению, имеющему тип функции

Ответ 2

Это не поведение undefined - для языка C требуется диагностика при использовании оператора sizeof с указателем функции (имя функции), поскольку это ограничение ограничения для оператора sizeof.

Однако, как расширение языка C, GCC допускает арифметику на указателях и указателях void, что делается путем обработки размера a 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.

Ответ 3

Это означает, что автор компилятора принял решение о значении 1 вместо того, чтобы заставить демонов летать из вашего носа (действительно, это было другое использование sizeof, которое дало нам это выражение: "сам компилятор C ДОЛЖЕН выдавать диагностика ЕСЛИ это первый необходимый диагностический результат вашей программы, а затем МОЖЕТ сам заставить демонов летать из вашего носа (что, между прочим, могло бы быть документированным диагностическим сообщением), так как оно МОЖЕТ выпускать дальнейшую диагностику для дальнейших нарушений правил синтаксиса или ограничений (или, если на то пошло, по любой причине, которую он выбирает). https://groups.google.com/forum/?fromgroups=#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8J

От этого есть сленговый термин "носовые демоны" для того, что компилятор решает сделать в ответ на конструкцию undefined. 1 - это носовой демон этого компилятора для этого случая.

Ответ 4

Как указывали другие, sizeof() может принимать любой действительный идентификатор, но не возвращает верного (честно истинного и действительного) результата для имен функций. Кроме того, это определенно может или не может привести к синдрому "демонов из носа".

Если вы хотите профилировать размер вашей программной функции, проверьте карту компоновщика, которая может быть найдена в промежуточной директории результатов (той, где вещи скомпилированы в .obj/.o или где лежит результирующее изображение/исполняемый файл). Иногда есть возможность генерировать или нет этот файл карты... он зависит от компилятора/компоновщика.

Если вам нужен размер указателя на функцию, они имеют одинаковый размер, размер слова адресации на вашем процессоре.