Ich habe zwei Code-Abschnitte wie unten, in Perl und C. Dies ist über Perls my
Variablen und C automatische Variablen. Zu einem gewissen Grad sind sie ziemlich ähnlich, da sie jedes Mal initialisiert werden, wenn sie die Funktion betreten. Aber Perl kann auf my
Variablen einer Subroutine verweisen, C wird einen zufälligen Wert erhalten, wenn dies geschieht, weil der Funktionsaufrufstapel nach der Rückkehr zerstört wird. Weiß jemand, wie Perl diese Funktion implementiert? Es könnte nicht jeden Unterroutinenaufrufstapel unberührt lassen, ist es, dass Perl jede my
Variable zuweist, die in einem Unterprogramm in "Datensegment" erstellt wurde (im Vergleich zum Stapel)?Wie implementiert Perl globale Referenz auf private Variable eines Unterprogramms?
Perl-Code:
use strict;
use warnings;
my $ref;
sub func
{
my $str = "hello";
$ref = \$str;
}
func;
print "value is ";
print "${$ref}\n";
C-Code:
#include <stdio.h>
int *pi;
void func(void)
{
int j = 9;
pi = &j;
}
int main(void)
{
func();
printf("value is ");
printf("%d\n", *pi);
return 0;
}
Danke,
Hi @Thilo Um die Referenzzählung für meine Variablen eines Unterprogramms verfügbar zu machen, bedeutet das, dass meine Variable im Datensegment gespeichert wird, wenn auf sie verwiesen wird? Und im Stapel gespeichert, wenn es nicht referenziert ist? – password636
Ich denke, alle Variablen in Perl sind im verwalteten Heap-Bereich, anstatt einen automatischen Stapel zugeordnet. Wenn die Subroutine beendet wird, nimmt die Anzahl der Referenzen für alle lokalen Variablen ab und wird normalerweise Null, es sei denn, Sie haben eine andere Referenz dafür erstellt. Das ist so, als würden Sie Objekte in Java verwenden (im Gegensatz zu Primitiven, die Stack-Allocated sein können und eher in Ihrem C-Beispiel sind). – Thilo