Als we de grootte van een functie controleren met sizeof()
, krijgen we altijd 1 byte.
Wat betekent deze 1 byte?
Antwoord 1, autoriteit 100%
Het is een schending van een beperking en uw compiler zoueen diagnose moeten stellen. Als het desondanks toch compileert, vertoont je programma ongedefinieerd gedrag [met dank aan @Steve Jessop voor de verduidelijking van de storingsmodus, en zie @Michael Burr’s antwoordwaarom sommige compilers dit toestaan]: Van C11, 6.5.3.4./1:
De operator
sizeof
mag niet worden toegepast op een uitdrukking met een functietype
Antwoord 2, autoriteit 70%
Dit is geen ongedefinieerd gedrag – de C-taalstandaard vereist een diagnose bij gebruik van de operator sizeof
met een functieaanduiding (een functienaam), aangezien het een schending van de beperking is voor de sizeof
operator.
Als uitbreiding op de C-taal, staat GCC echter rekenkunde toe op void
-pointers en functie-pointers, wat wordt gedaan door de grootte van een void
of een functie te behandelen als 1
. Als gevolg hiervan evalueert de operator sizeof
tot 1
voor void
of een functie met GCC. Zie http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html #Pointer-Arith
U kunt GCC een waarschuwing laten geven wanneer u sizeof
gebruikt met deze operanden door de opties -pedantic
of -Wpointer-arith
te gebruiken om GCC. Of maak er een fout van met -Werror=pointer-arith
.
Antwoord 3, autoriteit 16%
Het betekent dat de schrijver van de compiler een waarde van 1 heeft gekozen in plaats van demonen uit je neus te laten vliegen (inderdaad, het was een ander ongedefinieerd gebruik van sizeof
dat ons die uitdrukking gaf: “de C-compiler zelf MOET een diagnose afgeven ALS dit de eerste vereiste diagnose is die voortvloeit uit uw programma, en dan KAN zelf demonen uit uw neus laten vliegen (wat overigens heel goed het gedocumenteerde diagnostische bericht zou kunnen ZIJN), net zoals het KAN verdere diagnostiek afgeven voor verdere schendingen van syntaxisregels of beperkingen (of, wat dat betreft, om welke reden dan ook).” https://groups.google.com/forum/?fromgroups=#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8J
Hiervan is er een slangterm “nasale demonen” voor alles wat een compiler besluit te doen als reactie op een ongedefinieerde constructie. 1
is de nasale demon van deze compiler voor dit geval.
Antwoord 4, autoriteit 9%
Zoals anderen al aangaven, kan sizeof() elke geldige identifier aannemen, maar het zal geen geldig (een eerlijk waar en geldig) resultaat voor functienamen retourneren. Bovendien kan het zeker, of niet, resulteren in het “demonen uit de neus”-syndroom.
Als je de grootte van je programmafunctie wilt profileren, controleer dan de linkerkaart, die je kunt vinden in de directory met tussenliggende resultaten (degene waar dingen worden gecompileerd in .obj/.o of waar de resulterende afbeelding/uitvoerbaar bestand staat). Soms is er een optie om dit kaartbestand al dan niet te genereren… het is afhankelijk van de compiler/linker.
Als je de grootte van een aanwijzer naar een functie wilt, zijn ze allemaal even groot, de grootte van een adresserend woord op je cpu.