Lorsque nous vérifions la taille d'une fonction en utilisant sizeof()
on obtient toujours 1 octet . Que signifie ce 1 octet ?
Réponses
Trop de publicités?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
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
.
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.
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.