Finden Sie die Größe einer Funktion in C
Ich Lerne Funktionszeiger,ich verstehe, dass wir zeigen können Funktionen über Funktionszeiger.Dann nehme ich an, dass Sie bleiben in Erinnerung.Bleiben Sie im stack oder heap?Können wir berechnen Sie die Größe von Ihnen?
- was hat Sie veranlasst, zu entscheiden, wie ein user name?warum nicht mit Ihrem eigenen/einfachen Namen?
- Sind Sie ein lachen?? Sie sind die Standard-Benutzer-Namen, wenn Sie nicht wählen Sie einen aus.
- und warum gehst du nicht wählen?
- Ich dachte, die Nummer ist cool,also weiter mit ihm.
- Verwenden
$ nm filename.o
oder$ nm filename.obj
dann schauen Sie die "text" - Abschnitt, die Hex...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Platz für code ist statisch zugewiesen, indem der linker beim erstellen der code. In dem Fall, wo der code wird geladen, indem Sie ein Betriebssystem, das OS loader fordert, dass der Speicher vom OS und der code geladen wird es. Ähnlich wie statische Daten, wie der name schon sagt, zugeordnet zu dieser Zeit, als eine erste Stapel (obwohl weiter stapeln kann erstellt werden, wenn weitere threads erstellt werden).
Hinblick auf die Bestimmung der Größe einer Funktion, ist diese information bekannt ist, um den linker, und in den meisten tool-Ketten der linker kann erstellen einer map-Datei, die die Größe und Lage aller statischen Speicher-Objekte (d.h. solche, die nicht instanziiert werden, die zur Laufzeit auf dem stack oder heap).
Es gibt keine garantierten Weg zur Bestimmung der Größe einer Funktion zur Laufzeit (und wenig Grund, dies zu tun) jedoch, wenn Sie davon ausgehen, dass der linker sich Funktionen, die benachbart sind, in den source-code sequentiell in den Speicher, dann die folgenden können ein Indiz für die grösse einer Funktion:
Aber YMMV; ich habe versucht, diese in VC++ und es gab nur gültige Ergebnisse in einen "Release" - build; die Ergebnisse für ein "Debug" - build gemacht, keinen wirklichen Sinn. Ich schlage vor, dass die übung für Interesse nur, und hat keinen praktischen nutzen.
Andere Art der Beobachtung die Größe des Codes natürlich ist der Blick auf die Demontage der code in Ihrem debugger zum Beispiel.
Funktionen gehören text-segment (die möglicherweise oder möglicherweise nicht werden, 'Haufen') oder dessen äquivalent für die Architektur, die Sie verwenden. Es gibt keine Daten über Zusammenstellung hinsichtlich Ihrer Größe, Sie können höchstens Ihre entry point von symbol-Tabelle (die nicht verfügbar). So können Sie nicht berechnen, Ihre Größe in der Praxis auf die meisten C-Umgebungen, die Ihnen begegnen werden.
Sind Sie (normalerweise) getrennt von entweder der stack oder heap.
Gibt es Möglichkeiten zu finden, Ihre Größe, aber keiner von Ihnen ist auch nur annähernd tragbar. Wenn Sie denken, Sie brauchen/wollen, um die Größe wissen, die Chancen stehen ziemlich gut, dass Sie etwas tun, sollten Sie vermeiden.
Machen es einfach, Funktionen in der Regel gehen Sie nicht in den stack oder auf dem heap, da Sie dazu gedacht sind, nur-lese-Daten, in der Erwägung, dass stack und heap Lesen-schreiben-Erinnerungen.
Tun, die Sie wirklich brauchen, zu wissen, Ihre Größe zur Laufzeit? Wenn nicht, können Sie es durch einen einfachen
objdump -t -i .text a.out
wo ein.out ist der name Ihres binären. Die.text
ist, wo der linker setzt den code, und der Lader kann wählen, um dieses memory nur-lese - (oder auch nur execute-only). Wenn ja, wie es war, antwortete in vorherigen posts, es gibt Möglichkeiten, es zu tun, aber es ist schwierig und nicht tragbar... Clifford gab die einfachste Lösung, aber der linker nur selten stellt Funktion in einer sequenziellen Weise in die endgültige Binärdatei. Eine andere Lösung ist das definieren von Schnitten in deinem linker-Skript mit pragmas, und reservieren Sie einen Speicher für eine Globale variable, die gefüllt werden durch den linker mit SIZEOF(...) Abschnitt, die Ihre Funktion. Es ist der linker angewiesen, und nicht alle linkers diese Funktion bieten.Wie oben gesagt worden, Funktion, Größen erzeugt werden vom compiler zur compile-Zeit, und alle Größen bekannt, um den linker zur link-Zeit. Wenn Sie unbedingt müssen, können Sie stellen Sie den linker kick aus einer map-Datei mit der Start-Adresse, die Größe und natürlich der name. Sie können dann analysieren diese zur Laufzeit im code. Aber ich glaube nicht, dass es eine tragbare, zuverlässige Weise zu berechnen, die Sie zur Laufzeit ohne überschreitung der Grenzen von C.
Den linux-kernel macht eine ähnliche Verwendung dieser für die run-time-profiling.
C hat keinen garbage-collector. Mit einem Zeiger auf etwas, macht es nicht bleiben in Erinnerung.
Funktionen sind immer im Speicher, ob oder nicht Sie Sie verwenden, ob oder nicht Sie halten einen Zeiger auf Sie.
Dynamisch reservierte Speicher freigegeben werden kann, aber es hat nichts zu tun mit dem halten einen Zeiger darauf. Sie sollten nicht halten Zeiger auf Speicher, den Sie freigegeben haben, und Sie sollte es vor dem verlieren der Zeiger, aber die Sprache macht es nicht automatisch.
Wenn es so etwas wie die Größe von der Funktion sollte es sein, seinen STACK-FRAME-GRÖßE. Oder noch besser, versuchen Sie bitte, zu überlegen, was genau, Ihrer Meinung nach, sollte die Größe einer Funktion? Meinst du damit die statische Größe, ist die Größe von allen seinen opcode, wenn es geladen wird?Wenn es das ist was du meinst, dann ich nicht sehen, Ihr ist jeder Sprache bereitgestellt-Funktion, um das herauszufinden.Kann man sich für einige hack.Es kann viel.Aber ich habe nicht versucht, die.
hoffe, du bekommst deine Antwort, funktionieren alle irgendwo gespeichert
Hier die Ausgabe des Codes