Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

bogatstvo tipova u C

[es] :: C/C++ programiranje :: bogatstvo tipova u C

Strane: 1 2

[ Pregleda: 3443 | Odgovora: 34 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

stameni
Ivan Stamenković

Član broj: 6739
Poruke: 438



+7 Profil

icon Re: bogatstvo tipova u C22.11.2018. u 13:46 - pre 27 meseci
Uzgred, u C-u zaista ima mnogo tipova, pogotovo ako se uračunaju i njihovi modifikatori; ali pravo bogatstvo ovog jezika su operatori!

Operatori se uglavnom lakše uče od pointera, pa čak neke ni ne moraš da koristiš "odmah", nego "kad ti dođe", mada ih većina C-početnica pobrojava sve kada naiđe lekcija o njima.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16099
*.adsl-surfen.hetnet.nl.



+6896 Profil

icon Re: bogatstvo tipova u C22.11.2018. u 14:47 - pre 27 meseci
Citat:
Whitewater
Nazalost nisam bas nigde nasao lepo objasnjnje kako operativni sisitem dodeli C programu memoriju i koji deo C onda brine o dodeljivanju adresa ? Ili pak brine sam OS ??


Operativni sistem ima API-je (funkcije) za alokaciju i dealokaciju memorije.

Medjutim, obicno, ti API-ji imaju ogranicenja, recimo memoriju alociraju u blokovima od, npr., 4 kilobajta i sl.

Tvoj C program koristi C runtime biblioteku koja pruza standardne C lib. funkcije malloc(), free() i sl. - kad ti pozoves malloc(), C runtime biblioteka ce da alocira memoriju od OS-a i tebi vrati adresu (pointer) na alocirani blok memorije.

Obicno su C runtime biblioteke pametnije, pa alociraju malo vece blokove memorije pa tebi daju delice tih blokova kako ne bi stalno zvale OS API-je koji su em skupi (u smislu da mora da se "zove" OS), em imaju ogranicenja tipa. da ti daju N*4K blokove. Zamisli situaciju da tvoj program 1000 puta zove malloc(100), kada u Windows-u svaki put zvao OS (VirtualAlloc) ti bi 1000 puta alocirao po 4 kilobajta umesto 100 bajtova. Zato C runtime biblioteka ima svoj menadzment memorije koji se stara o malim alokacijama.

Znaci prica obicno ide ovako:

Tvoj C program <-> C runtime biblioteka <-> Operativni sistem


DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1
Demo Videos: http://www.digicortex.net/node/17
Gallery: http://www.digicortex.net/node/25
 
Odgovor na temu

Whitewater
dummy workshop

Član broj: 339178
Poruke: 339



+130 Profil

icon Re: bogatstvo tipova u C23.11.2018. u 20:02 - pre 27 meseci
hvala svima zadali ste mi mnogo domaceg, treba to sve iscitati sada. Onaj tutorial o pointerima procitao sam u dahu i saznao za koncept lvalue i rvalue.

Jos na pocetku rada sa pointerima zapitao sam se sledece.

int x=5

ko vodi racuna o adresi x ? Sad shvatam da je to runtime biblioteka. To znaci da ona pravi svoju tabelu opet nekih pointera gde kaze aha kad vidis x to je na adresi toj i toj.

Dakle OS kad se startuje c program odmah odredi deo memorijei kaze eto to ti je to sad se ti organizuj kako hoces na tom prostoru tvoja stvar, a sto se tice procesora to cu ti ja reci kad mozes da ga koristis kad ne kad ide prioritet.


Rest of world: This is what we think of America.
America: We don't think about you at all !
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3002

Jabber: djoka_l


+1268 Profil

icon Re: bogatstvo tipova u C23.11.2018. u 23:05 - pre 27 meseci
Ma nisi shvatio.
Kada napišeš
int x=5;
kompajler ubaci naziv x u tabelu simbola. U zavisnosti da li je x lokalna promenljiva ili globalna promenljiva, tom se simbolu dodeljuje adresa od strane kompajlera.
Lokalne varijable se smeštaju na stek, pa kompajler u tom slučaju generiše mašinsku komandu

MOVE SP-4, 5

Uz pretpostavku da je SP sadržaj registra koji je stek pointer, a ofset varijable 4 bajta ispod vrha steka.
Moguće je da kompajler odluči da je zgodno da x drži u registru, na primer R03, pa generiše kod

MOVE R03, 5

Ili, da vrednost drži u RW delu memorije, recimo na adresi 1024000, pa onda ni ne generiše nikakvu mašinsku komandu, nego na adresu 1024000 upiše 5, a prilikom korišćenja varijable x piše ili čita sa adrese 1024000.

Dakle, deklaracija i incijalizacija varijable se ne dešavaju od strane runtime biblioteka (obično) nego se kod generiše u proceu kompajliranja.
 
Odgovor na temu

Whitewater
dummy workshop

Član broj: 339178
Poruke: 339



+130 Profil

icon Re: bogatstvo tipova u C25.11.2018. u 11:49 - pre 27 meseci
malo sam istrazivao...

taj stack pointer ima veze sa konceptom scope tipova zar ne ? Kako sam raumeo main kad pozove funkciju fun1 onda se njene promenljive stavljaju na vrh steka, a kad se vrati u main SP se vraca na main, a fun1 ostaje iznad pointer tj ide u garbage i tako lokalne promenljive iz fun1 nisu vise dostupne main-u D/N ?

a ti kazes da kompajler odredjuje adrese prmenljvih. meni to ne zvuci logicno. Zar se to ne desava tokom runtime jer tek onda zapravo nas kod kontaktira OS i moli dodelu prstora koga ce on onda izdeliti na svoj stack, heap itd....

???


Rest of world: This is what we think of America.
America: We don't think about you at all !
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3002

Jabber: djoka_l


+1268 Profil

icon Re: bogatstvo tipova u C25.11.2018. u 12:35 - pre 27 meseci
Stek i scope (opseg) nemaju veze jedan sa drugim.
Stek je struktura podataka a opseg je logički koncept koji kaže kakva je vidljivost simboličkih naziva unutar programa.

Evo primera:
Code (c):

#include <stdio.h>

int main()
{
    int i=1;
    int *p=&i;
   
    for(int i=0; i<3; i++) printf("loop i=%d, outer i=%d\n", i, *p);
   
    printf("outer i=%d\n", i);

    return 0;
}
 

Code:

Rezultat:

loop i=0, outer i=1                                                                                                            
loop i=1, outer i=1                                                                                                            
loop i=2, outer i=1                                                                                                            
outer i=1

U programu je deklarisana varijabla "i" čija je vidljivost cela funkcija main. Međutim, za for petlju je ponovo deklarisana varijabla "i", pa zbog načina na koji C obrađuje scope, "maskira" varijablu "i" iz main funkcije.

Možeš da zamisliš da je "i" iz main funkcije neko "i1", a "i" iz for petlje neko "i2". Kompajler, kada analizira kod, nema problema sa ovim načinom deklarisanja varijabli.
A to, da li je "i" u petlji na steku, u registru ili negde u memoriji, nema veze sa tim koja je njena vidljivost.
 
Odgovor na temu

Whitewater
dummy workshop

Član broj: 339178
Poruke: 339



+130 Profil

icon Re: bogatstvo tipova u C25.11.2018. u 22:19 - pre 27 meseci
ne nisam mislio na petlju for, npr:

Code:
main{
   int vmain
   ....
     fun1{
        int vfun1;
        ......
        fun2{
            int vfun2;
            ......
                fun3{
                    int vfun3;
                    .....
                }
         }
      }
}


promenljiva vfun3 nece biti dotupna u fun2 jer ce SP pokazivati na nju samo dok se izvrsava fun3, a kad se SP pomeri na fun2 sve vezano za fun3 postaje garbage,,,

bar tako sam razumeo objasnjenje. Znam ja sta je stek LIFO itd...

Rest of world: This is what we think of America.
America: We don't think about you at all !
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 5176
109.72.51.*



+1026 Profil

icon Re: bogatstvo tipova u C25.11.2018. u 23:17 - pre 27 meseci
Sta ti je to SP? Ako si mislio na Stack Pointer onda si u velikoj zabludi. Alokacija za lokalne varijable jedne f-je se vrsi napocetku obicno za sve lokalne varijable bez obzira na scope.
SP pokazuje na vrh steka bez obzira kojoj varijabli pristupas. Scope je cisto stvar kompajlera.
press any key to continue or any other to quit....
 
Odgovor na temu

Whitewater
dummy workshop

Član broj: 339178
Poruke: 339



+130 Profil

icon Re: bogatstvo tipova u C26.11.2018. u 01:25 - pre 27 meseci
da, SP mi je (i ne samo meni) je pokazivac na stek, a to je vrh steka.

upis na stek SP++ i upis,
skidanje sa steka SP-- uz ostavljanje bivseg vrha kao garbage

govorim o assembleru valda tako komunicira kompajlirani C kod sa runtime ?
Rest of world: This is what we think of America.
America: We don't think about you at all !
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 5176
109.72.51.*



+1026 Profil

icon Re: bogatstvo tipova u C26.11.2018. u 06:31 - pre 27 meseci
SP se oduzme za alokaciju (stek raste na dole) i to na pocetku f-je. Dealoakcija se na kraju izvrsi ili vracanjem sacuvane prethodne vrednosti ili sabiranjem na kraju f-je. Izgenerisi asembler pa onda pricaj, nemoj napamet.
press any key to continue or any other to quit....
 
Odgovor na temu

Whitewater
dummy workshop

Član broj: 339178
Poruke: 339



+130 Profil

icon Re: bogatstvo tipova u C26.11.2018. u 09:06 - pre 27 meseci
vidi, u kontekstu ovoga o cemu pricamo sasvim je nebitno da li stek raste na gor ili na dole.
Rest of world: This is what we think of America.
America: We don't think about you at all !
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3002

Jabber: djoka_l


+1268 Profil

icon Re: bogatstvo tipova u C26.11.2018. u 09:10 - pre 27 meseci
Citat:
promenljiva vfun3 nece biti dotupna u fun2 jer ce SP pokazivati na nju samo dok se izvrsava fun3, a kad se SP pomeri na fun2 sve vezano za fun3 postaje garbage,,,


Kao što ti ja Branko već napisao, to nema veze sa stekom. Kompajler je onaj koji određuje scope. To što fun2 ne vidi vfun3 je zato što kompajler ne dozvoljava da je vidi, a ne zato što je na steku. I nemoj da pridaješ magične osobine runtime okruženju. Kompajler generiše MAŠINSKI kod. Možeš da napraviš takav program da ne poziva NI JEDNU runtime funkciju. Ali ipak radi. Alokacija prostora na steku nije usluga runtime biblioteke, to radi generisani kod od strane kompajlera. Samo što kompajler pokušava da te spase od tvojih brljotina. Ako si ipak čuo za problem buffer overrun, to je kad tvoj program počne da divlja i da dohvata i menja podatke koje ne bi trebao da menja. Obično zato što ne kontroliše indekse nizova.
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 5176
82.117.201.*



+1026 Profil

icon Re: bogatstvo tipova u C26.11.2018. u 09:25 - pre 27 meseci
Citat:
Whitewater:
vidi, u kontekstu ovoga o cemu pricamo sasvim je nebitno da li stek raste na gor ili na dole.


U kontekstu onoga o cemu pricamo netacno si izneo kako stvari rade...

press any key to continue or any other to quit....
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16099
*.adsl-surfen.hetnet.nl.



+6896 Profil

icon Re: bogatstvo tipova u C26.11.2018. u 10:28 - pre 27 meseci
@Whitewater,

Kompajleri imaju korisnu opciju da generisu i citljivi asemblerski kod (.asm fajlove). Ova opcija moze biti vrlo korisna ako tek ucis low-level C programiranje i sa njom ce ti biti mnogo jasnije sta se tacno desava tj. za koje stvari je zaduzen kompajler (tj. generisani masinski kod) a za koje stvari je zaduzena C runtime biblioteka.

Evo ti primer C koda:

Code:

void main()
{
  int a = 5;
  
  {
    //
    // Jos jedan "scope"
    
    int b = 6;
    
    printf("a=%d, b=%d\n", a, b);
  
  }  
}


A evo kakav je asemblerski kod generisao Microsoftov C kompajler:

Code:

; Listing generated by Microsoft (R) Optimizing Compiler Version 18.00.40629.0 

include listing.inc

INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES

_DATA    SEGMENT
$SG1340    DB    'a=%d, b=%d', 0aH, 00H
_DATA    ENDS
PUBLIC    main
EXTRN    printf:PROC
pdata    SEGMENT
$pdata$main DD    imagerel $LN3
    DD    imagerel $LN3+48
    DD    imagerel $unwind$main
pdata    ENDS
xdata    SEGMENT
$unwind$main DD    010401H
    DD    06204H
xdata    ENDS
; Function compile flags: /Odtp
_TEXT    SEGMENT
promenljiva_b$1 = 32
promenljiva_a$ = 36
main    PROC
; File c:\temp\hello.c
; Line 2
$LN3:
    sub    rsp, 56                    ; 00000038H
; Line 3
    mov    DWORD PTR promenljiva_a$[rsp], 5
; Line 9
    mov    DWORD PTR promenljiva_b$1[rsp], 6
; Line 11
    mov    r8d, DWORD PTR promenljiva_b$1[rsp]
    mov    edx, DWORD PTR promenljiva_a$[rsp]
    lea    rcx, OFFSET FLAT:$SG1340
    call    printf
; Line 14
    xor    eax, eax
    add    rsp, 56                    ; 00000038H
    ret    0
main    ENDP
_TEXT    ENDS
END


Kao sto vidis, scope nema veze sa tim gde kompajler alocira memoriju za promenljive.
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1
Demo Videos: http://www.digicortex.net/node/17
Gallery: http://www.digicortex.net/node/25
 
Odgovor na temu

Whitewater
dummy workshop

Član broj: 339178
Poruke: 339



+130 Profil

icon Re: bogatstvo tipova u C27.11.2018. u 08:03 - pre 27 meseci
Citat:
Branimir Maksimovic:
Citat:
Whitewater:
vidi, u kontekstu ovoga o cemu pricamo sasvim je nebitno da li stek raste na gor ili na dole.


U kontekstu onoga o cemu pricamo netacno si izneo kako stvari rade...


ovo je bio klizeci start
Rest of world: This is what we think of America.
America: We don't think about you at all !
 
Odgovor na temu

[es] :: C/C++ programiranje :: bogatstvo tipova u C

Strane: 1 2

[ Pregleda: 3443 | Odgovora: 34 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.