Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7827[/thread]

Perl und Garbage collector: Warum macht der Perl GC nichts? (Seite 2)



<< |< 1 2 >| >> 15 Einträge, 2 Seiten
murphy
 2006-03-25 14:12
#64062 #64062
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=esskar,25.03.2006, 02:59][quote=Relais,24.03.2006, 21:22]Können Programme während ihrer Laufzeit Speicher an das OS zurückgeben? Wie geht das?[/quote]
ich kann jetzt nur von windows sprechen:
ein prozess hat - egal wieviel RAM der computer hat - 2 GB virtuellen speicher (RAMD + SWAP). Diesen kann er beliebig nutzen.

Unter C/C++ kann man zwischen zwei Arteb von Speicher unterschienden. Code-Speicher und Stack-Speicher (@Ronnie: in uralt C Zeiten kannte man Heap noch gar nicht)

eine
Code: (dl )
char var[512];
belegt z.b. 512 bytes vom code speicher, wobei ein
Code: (dl )
char *var = new char[512]
512 bytes auf dem stack belegt. Code-speicher kann man nicht - zumindeest nicht durch anschupsen - an das OS wieder zurück geben. Speicher Stack schon, und zwar mit
Code: (dl )
delete var
.
[...][/quote]
Irgendwie finde ich deine Definition von Stack ausgemacht merkwürdig. Und deine Definition von Code würde ich auch lieber "statische Daten" nennen.

Es ist meines Erachtens schon sinnvoll, zwischen statisch gemappten Daten, automatisch gemapptem Stack und programmgesteuert gemapptem Heap zu unterscheiden.
When C++ is your hammer, every problem looks like your thumb.
esskar
 2006-03-25 15:41
#64063 #64063
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
stimmt, ich hab es verpeilt:

char x[...] liegt im Programmspeicher; char *x; im Datenspeicher und zeigt nur auf den Stack.

aber was macht den bei dir folgendes?

foo.c
Code: (dl )
1
2
char *x = "foo";
char y[8];


bar.c
Code: (dl )
1
2
extern char *x;
extern char y[8];
murphy
 2006-03-25 16:27
#64064 #64064
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=esskar,25.03.2006, 13:41][...]
aber was macht den bei dir folgendes?
[...][/quote]

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Script started on Sat Mar 25 13:54:39 2006
~ $ cat >foo.c
char *x = "foo";
char y[8];
^D
~ $ cat >bar.c
extern char *x;
extern char y[8];
^D
~ $ gcc -Wall -O3 -g0 -S foo.c
~ $ gcc -Wall -O3 -g0 -S bar.c
~ $ cat foo.S
    .section __TEXT,__text,regular,pure_instructions
    .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
    .machine ppc
    .globl _x
    .cstring
    .align 2
LC0:
    .ascii "foo\0"
    .data
    .align 2
_x:
    .long    LC0
.comm _y,8
    .subsections_via_symbols
~ $ cat bar.S
    .section __TEXT,__text,regular,pure_instructions
    .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
    .machine ppc
    .subsections_via_symbols
~ $ exit

Script done on Sat Mar 25 13:56:19 2006


Die Stringdaten selber werden also im Nur-Lesen-Bereich der statisch gemappten Daten abgelegt, der Pointer auf die Stringdaten und das Array im statisch gemappten Datenbereich.

Die externen Symbole erzeugen keinen Code / Daten, sondern sind nur als Deklarationen für den Compiler wichtig.

Ich habe zwar gerade kein Windows oder Linux zur Hand um zu vergleichen, meine mich aber zu erinnern, dass das zumindest unter Linux ähnlich aussieht.

(edit: typescript Formatierung lesbarer gemacht)\n\n

<!--EDIT|murphy|1143297282-->
When C++ is your hammer, every problem looks like your thumb.
esskar
 2006-03-25 17:02
#64065 #64065
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
foo.asm
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    TITLE    foo.c
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC _x
_DATA SEGMENT
COMM _y:BYTE:08H
_x DD FLAT:$SG463
$SG463 DB 'foo', 00H
_DATA ENDS
END


bar.asm
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    TITLE    bar.c
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
END
Relais
 2006-03-26 14:51
#64066 #64066
User since
2003-08-06
2261 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Relais,24.03.2006, 21:22]Können Programme während ihrer Laufzeit Speicher an das OS zurückgeben? Wie geht das?[/quote]
[...]

Danke für die vielen Antworten! 8)
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop 12. bis 14. Mai 2025 in München.

Winter is Coming
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2006-03-24 18:37.