Waarom is de grootte van een functie in C altijd 1 byte?

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 sizeofmag 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 sizeofmet een functieaanduiding (een functienaam), aangezien het een schending van de beperking is voor de sizeofoperator.

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 voidof een functie te behandelen als 1. Als gevolg hiervan evalueert de operator sizeoftot 1voor voidof 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 sizeofgebruikt met deze operanden door de opties -pedanticof -Wpointer-arithte 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 sizeofdat 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. 1is 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.

Other episodes