87 votes

Pourquoi la taille d'une fonction en C est toujours de 1 octet ?

Lorsque nous vérifions la taille d'une fonction en utilisant sizeof() on obtient toujours 1 octet . Que signifie ce 1 octet ?

80voto

Kerrek SB Points 194696

C'est une violation de contrainte, et votre compilateur devrait le diagnostiquer. S'il le compile malgré cela, votre programme a un comportement indéfini [merci à @Steve Jessop pour la clarification du mode de défaillance, et voir Réponse de @Michael Burr pour savoir pourquoi certains compilateurs l'autorisent] : De C11, 6.5.3.4./1 :

El sizeof ne doit pas être appliqué à une expression qui a le type de fonction

56voto

Michael Burr Points 181287

Il ne s'agit pas d'un comportement indéfini - la norme du langage C exige un diagnostic lors de l'utilisation de la fonction sizeof avec un désignateur de fonction (un nom de fonction) car cela constitue une violation de contrainte pour l'opérateur sizeof opérateur.

Cependant, en tant qu'extension du langage C, GCC permet l'arithmétique sur les éléments suivants void et les pointeurs de fonction, ce qui est fait en traitant la taille d'un pointeur de fonction comme un pointeur de fonction. void ou une fonction comme 1 . En conséquence, le sizeof sera évalué à 1 pour void ou une fonction avec GCC. Voir http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html#Pointer-Arith

Vous pouvez faire en sorte que GCC émette un avertissement lors de l'utilisation de sizeof avec ces opérandes en utilisant l'option -pedantic o -Wpointer-arith options pour GCC. Ou faites-en une erreur avec -Werror=pointer-arith .

13voto

Jon Hanna Points 40291

Il signifie que le rédacteur du compilateur a décidé d'une valeur de 1 plutôt que de faire voler des démons par le nez (en effet, il s'agissait d'une autre utilisation non définie de l'option sizeof qui nous a donné cette expression : "le compilateur C lui-même DOIT émettre un diagnostic SI c'est le premier diagnostic requis résultant de votre programme, puis PEUT lui-même faire voler des démons de votre nez (ce qui, soit dit en passant, pourrait bien ÊTRE le message de diagnostic documenté) tout comme il PEUT émettre d'autres diagnostics pour d'autres violations des règles ou contraintes syntaxiques (ou, d'ailleurs, pour toute raison qu'il choisit)." https://groups.google.com/forum/?fromgroups=#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8J

D'où le terme argotique "démons nasaux" pour désigner ce qu'un compilateur décide de faire en réponse à une construction non définie. 1 est le démon nasal de ce compilateur pour ce cas.

7voto

jpinto3912 Points 897

Comme d'autres l'ont souligné, sizeof() peut prendre n'importe quel identifiant valide, mais il ne retournera pas un résultat valide (un résultat honnêtement vrai et valide) pour les noms de fonctions. De plus, il peut certainement, ou non, résulter du syndrome des "démons du nez".

Si vous voulez profiler la taille des fonctions de votre programme, vérifiez la carte du linker, qui peut être trouvée dans le répertoire des résultats intermédiaires (celui où les choses sont compilées en .obj/.o ou où l'image/exécutable résultant se trouve). Il existe parfois une option permettant de générer ou non ce fichier map... cela dépend du compilateur et du linker.

Si vous voulez connaître la taille d'un pointeur vers une fonction, ils ont tous la même taille, celle d'un mot d'adressage sur votre processeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X