tipo - ¿Por qué el tamaño de una función en C es siempre de 1 byte?
unsigned char c (4)
Como otros señalaron, sizeof () puede tomar cualquier identificador válido, pero no arrojará un resultado válido (honestamente verdadero y válido) para los nombres de las funciones. Además, definitivamente puede, o no, resultar en el síndrome de "demonios fuera de la nariz".
Si desea perfilar el tamaño de su función de programa, consulte el mapa del enlazador, que se puede encontrar en el directorio de resultados intermedios (aquel en el que las cosas se compilan en .obj / .o o donde se encuentra la imagen resultante / ejecutable). A veces hay una opción para generar o no este archivo de mapa ... depende del compilador / vinculador.
Si quería el tamaño de un puntero a una función, todas tienen el mismo tamaño, el tamaño de una palabra de direccionamiento en su CPU.
Cuando verificamos el tamaño de una función usando sizeof()
, siempre obtenemos 1 byte . ¿Qué significa este 1 byte?
Es una violación de restricción, y tu compilador debería diagnosticarla. Si lo compila a pesar de eso, su programa tiene un comportamiento indefinido [gracias a @Steve Jessop por la aclaración del modo de falla, y vea la respuesta de @Michael Burr de por qué algunos compiladores lo permiten]: de C11, 6.5.3.4./ 1:
El operador
sizeof
no se aplicará a una expresión que tenga un tipo de función
Este no es un comportamiento indefinido: el estándar de lenguaje C requiere un diagnóstico cuando se usa el operador sizeof
con un designador de función (un nombre de función) ya que es una violación de restricción para el operador sizeof
.
Sin embargo, como una extensión del lenguaje C, GCC permite la aritmética en punteros void
y punteros de función, lo que se hace tratando el tamaño de un void
o una función como 1
. Como consecuencia, el operador de sizeof
evaluará a 1
para void
o una función con GCC. Ver http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html#Pointer-Arith
Puede hacer que GCC emita una advertencia cuando use sizeof
con estos operandos usando las -pedantic
o -Wpointer-arith
para GCC. O cometer un error con -Werror=pointer-arith
.
Significa que el compilador decidió un valor de 1 en lugar de hacer que los demonios salgan volando de tu nariz (de hecho, fue otro uso indefinido de sizeof
que nos dio esa expresión: "el compilador de C DEBE emitir un diagnóstico SI esta es la primera vez" el diagnóstico requerido como resultado de su programa, y luego PUEDE hacer que los demonios salgan volando de su nariz (que, dicho sea de paso, bien podría SER el mensaje de diagnóstico documentado) así como PUEDE emitir diagnósticos adicionales para violaciones adicionales de reglas de sintaxis o restricciones (o , para el caso, por cualquier motivo que elija). " https://groups.google.com/forum/?fromgroups=#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8J
De esto hay una jerga que se llama "demonios nasales" para cualquier cosa que un compilador decida hacer en respuesta a una construcción indefinida. 1
es el demonio nasal de este compilador para este caso.