83 votos

¿Por qué es el tamaño de una función en C siempre 1 byte?

Cuando comprobamos el tamaño de una función usando sizeof() , siempre nos dan 1 byte. ¿Qué significa este 1 byte?

80voto

Kerrek SB Puntos 194696

Es una violación de restricción, y el compilador debe diagnosticarlo. Si lo compila a pesar de eso, su programa ha indefinido comportamiento [gracias a @Steve Jessop para la clarificación del modo de fallo y ver respuesta de @Michael Burr para por qué algunos compiladores permitan esto]: de C11, 6.5.3.4./1:

La sizeof operador no se aplicarán a una expresión que tiene el tipo de función

54voto

Michael Burr Puntos 181287

Este no es un comportamiento indefinido - el lenguaje C estándar requiere un diagnóstico cuando se utiliza la sizeof operador con una función de designación de la (nombre de la función), ya que es una violación de la restricción de la sizeof operador.

Sin embargo, como una extensión del lenguaje C, GCC permite aritmética void punteros de punteros de función, la cual es realizada por el tratamiento del tamaño de un void o una función como 1. Como consecuencia, la sizeof operador evaluará a 1 para void o una función con GCC. Ver http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html#Pointer-Arith

Usted puede obtener GCC para emitir una advertencia cuando se utiliza sizeof con estos operandos mediante la -pedantic o -Wpointer-arith opciones a GCC. O hacer un error con -Werror=pointer-arith.

13voto

Jon Hanna Puntos 40291

Esto significa que el compilador escritor decidió en un valor de 1 en lugar de hacer los demonios de la mosca de la nariz (de hecho, fue otro uso indistinto de sizeof que nos dio que la expresión: "el compilador de C DEBE emitir un diagnóstico SI este es el primer diagnóstico que resulten de su programa y, a continuación, en sí, PUEDE causar que los demonios de la mosca de la nariz (que, por cierto, que bien podría SER la documentada mensaje de diagnóstico) tal como PUEDE emitir diagnósticos adicionales para futuras violaciones de la sintaxis de las reglas o restricciones (o, para el caso, por cualquier razón, se decide)." https://groups.google.com/forum/?fromgroups=#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8J

De esto no hay término del argot "nasal demonios" por lo que un compilador decide a hacer en respuesta a un indefinido de la construcción. 1 es la nasal demonio de este compilador para este caso.

7voto

jpinto3912 Puntos 897

Como otros señalaron, sizeof() puede tomar cualquier identificador válido, pero no va a devolver un válido (un honestamente verdadero y válido) resultado de los nombres de función. Por otra parte, que sin duda se puede, o no, el resultado en "los demonios de la nariz" síndrome de down.

Si desea perfil de su programa en función de tamaño, compruebe que el conector del mapa, que se puede encontrar en los resultados intermedios de directorio (el que las cosas se compilan en .obj/.o o donde la imagen resultante/ejecutable lays). A veces hay una opción para generar o no este archivo de mapa... es compilador/enlazador dependiente.

Si quiere que el tamaño de un puntero a una función, son todos del mismo tamaño, el tamaño de un direccionamiento de palabra en su cpu.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X