Avainsanojen Virtual ja Dynamic vertailu
Mitä eroa?
Miten käyttötarkoitus eroaa?
Hyödyt/haita?
Virtual Dynamic
14
784
Vastaukset
- avainsana
Noiden ero on lähinnä muistin käytössä ja nopeudessa Dynamic käyttää vähemmän muistia Virtual taas enemmän mutta on nopeampi,liittyy siis siihen miten luokkia käsitellään, kumpi parempi riippuu siis ihan käyttötarkoituksesta ja sovelluksesta.
- moloaivo
Eli siis dynamic on menneen talven lumia, ja virtual jyrää, olisi kiva nähdä käytännössä
mitä kääntäjä tekee noiden parametrien kanssa.
Asiasta toiseen ABSTRACT- luokka/metodi on hyvä asia, helpottaa käytännön tiimissä paljon... - avainsana
moloaivo kirjoitti:
Eli siis dynamic on menneen talven lumia, ja virtual jyrää, olisi kiva nähdä käytännössä
mitä kääntäjä tekee noiden parametrien kanssa.
Asiasta toiseen ABSTRACT- luokka/metodi on hyvä asia, helpottaa käytännön tiimissä paljon...Ei ole menneen talven lumia, jos olisi se olisi jo poitettu, sillä joskus riipuen sovellukseksesta se voi olla todella paikallaan, ja niin siis se erohan on siinä miten niitä muistissa käsitellään.
- Kysymys?_
Kuinka paljon nopeampi on virtual?
Miten paljon dynamic vie vähemmän muistia? - .....
Kysymys?_ kirjoitti:
Kuinka paljon nopeampi on virtual?
Miten paljon dynamic vie vähemmän muistia?turha tollasiin juuttua miettimään ellei kyseessä sitten ole erityisen kompaktille laitteelle tuleva sovellus missä rahalliset resurssit, nopeusero on lähinnä nimellinen. virtuaalimetodit on hitaampia kutsua, koska metodin koodin alkuosoite pitää hakea luokan virtuaalimetoditaulukosta jotta se osaa ajon aikana kutsun yhteydessä valita oikean ylikirjoitetun metodin. dynamic taas tietää jo käännösvaiheessa oikean metodin. virtuaalikutsu on ehkä 20-30% hitaampi, joten tietenkään missään nopeissa algoritmeissä niitä ei kannata käyttää.
- meni....
..... kirjoitti:
turha tollasiin juuttua miettimään ellei kyseessä sitten ole erityisen kompaktille laitteelle tuleva sovellus missä rahalliset resurssit, nopeusero on lähinnä nimellinen. virtuaalimetodit on hitaampia kutsua, koska metodin koodin alkuosoite pitää hakea luokan virtuaalimetoditaulukosta jotta se osaa ajon aikana kutsun yhteydessä valita oikean ylikirjoitetun metodin. dynamic taas tietää jo käännösvaiheessa oikean metodin. virtuaalikutsu on ehkä 20-30% hitaampi, joten tietenkään missään nopeissa algoritmeissä niitä ei kannata käyttää.
Kaikki meni niin päin v:ua kun vain mahdollista!
- .......
meni.... kirjoitti:
Kaikki meni niin päin v:ua kun vain mahdollista!
no kiva, kerro sitten oma käsityksesi asiasta, mutta ei ole minun syy jos olet käsittänyt asiat päin vittua.
- -_.|._-
..... kirjoitti:
turha tollasiin juuttua miettimään ellei kyseessä sitten ole erityisen kompaktille laitteelle tuleva sovellus missä rahalliset resurssit, nopeusero on lähinnä nimellinen. virtuaalimetodit on hitaampia kutsua, koska metodin koodin alkuosoite pitää hakea luokan virtuaalimetoditaulukosta jotta se osaa ajon aikana kutsun yhteydessä valita oikean ylikirjoitetun metodin. dynamic taas tietää jo käännösvaiheessa oikean metodin. virtuaalikutsu on ehkä 20-30% hitaampi, joten tietenkään missään nopeissa algoritmeissä niitä ei kannata käyttää.
Dynamic optimoi muistin kulutuksen
ja virtual optimoi nopeuden
http://www.delphibasics.co.uk/RTL.asp?Name=Dynamic
http://www.delphibasics.co.uk/RTL.asp?Name=Virtual
- ak kaa
Jos kerran Pascal:ssa voi ohjelmoija valita kumpaa tapaa käyttää niin entäpä muissa kielissä?
- Onko tietoa?
Miten on ? Voiko samassa luokassa käyttää
eri tapoja ristiin? Eli virtual toisessa metodissa ja dynmic toisessa?- DelphiGuru
"Voiko samassa luokassa käyttää
eri tapoja ristiin? Eli virtual toisessa metodissa ja dynamic toisessa?"
Kyllä voi!
mutta em. selitys oli tosiaan hieman pielessä.
Siis ne metodit, joita EI ole määritelty kummallakaan, sen paremmin virtual kuin dynamic -avainsanallakaan, niiden osalta kääntäjä laittaa suoraan oikean kutsuosoitteen paikalleen, joten ajoaikana kutsu on nopein mahdollinen eikä se vie ylimääräistä muistitilaakaan.
Valitettavasti tuon huono puoli on tämä:
type
TElain = class
procedure TuotaAani;
procedure Aantele;
end;
TKoira = class(TElain)
procedure TuotaAani;
end;
TKissa = class(TElain)
procedure TuotaAani;
end;
procedure TElain.TuotaAani;
begin
WriteLn('Oletusääni !!!');
end;
procedure TElain.Aantele;
begin
TuotaAani;
end;
procedure TKoira.TuotaAani;
begin
WriteLn('Hau !');
end;
procedure TKissa.TuotaAani;
begin
WriteLn('Miau !');
end;
Nyt jos teet näin:
var
Mirre : TKissa;
begin
Mirre := TKissa.Create;
Mirre.Aantele;
end;
Niin tuo ohjelma tulostaa:
Oletusääni !!!
Eli tuo Mirre.Aantele kutsuu suoraan TElain.Aantele
Ja koska TElain.Aantele -metodia ei ole muutettu muissa luokissa, se kutsuu aina TElain.TuotaAani;
Eli ohjelma ei toimi kuten käyttäjä ehkä olettaisi.
em. esimerkissä tuo TElain.TuotaAani;
pitää määritellä joko virtual tai dynamic -avainsanalla, ja vastaavasti TKoira.TuotaAani; ja TKissa.TuotaAani; override:llä.
Tällöin ohjelma toimii halutulla tavalla.
erona on tämä:
Jos käytät:
virtual;
-määrettä, niin sen luokan, jossa ko. metodi on määritelty, ja kaikkien siitä (suoraan tai välillisesti) perittyjen luokkien virtuaalimetoditaulukossa on tuon metodin luokkakohtainen toteutusosoite, eli siis erikseen:
TElain.TuotaAani;
TKoira.TuotaAani;
TKissa.TuotaAani;
Jos taas käytät dynamic -avainsanaa, silloin sen luokan, jossa ko. dynaaminen metodi on alunperin määritelty JA jokaisen sellaisen siitä (suoraan tai välillisesti) perittyjen luokkien, jossa ko. metodi on uudelleenmääritelty (override),
dynaamisten metodien taulukossa on tuon metodin luokkakohtainen toteutusosoite.
Tässä tapauksessa ei siis paljon eroa, mutta jos olisi vaikkapa:
TMustakissa = class(TKissa)
ja
TValkoinenKissa = class(TKissa)
ja oletetaan, että ko. TuotaAani; -metodia EI ole näissä uudelleenmääritelty, niin virtual -avainsanaa käytettäessä tulee virtuaalimetoditaulukkoon silti lisämerkinnät:
TMustakissa.TuotaAani;
TValkoinenKissa.TuotaAani;
Sensijaan dynamic -tapaa käytettäessä TMustakissa ja TValkoinenKissa -luokkiin EI tule merkintää TuotaAani; -metodista (koska sitä ei muutettu).
Siksi dynamic kuluttaa vähemmän muistitilaa, kun metodiosoitteita ei tarpeettomasti kopioida uusien perytettyjen luokkien taulukkoon jos ko. metodia ei ole ko. luokassa uudelleenmääritelty.
Mutta samasta syystä, koska dynamic -tavalla ei ole vakiopaikkaa mistä metodin koodin osoite löytyy, niin sen hakeminen on monimutkaisempi (ja siksi hitaampi) prosessi.
WIN32 -ympäristöstä en ole ihan varma, mutta aikanaan WIN16 -ympäristössä (= Delphi 1.0 ) oli muistaakseni niin, että message -avainsanalla saattoi määritellä käsittelijän windows -viesteille 0..32767 ja 16-bittiset arvot 32768..65535 oli varattu dynaamisten metodien käsittelylle.
Eli dynaamiset metodit ja suoramääritellyt windows -viestien käsittelijät oli rakennettu kääntäjän puolelta samalla tavalla, mutta arvoalue oli jaettu kahtia, toinen alue dynaamisten metodien ja toinen windows -viestikäsittelijöiden tarpeisiin.
Kun WIN32 -aikakaudella kokonaislukujen "luonnollisin" koko on 32 bittiä, tuo asia on hieman muuttunut.
Mutta edelleenkin Delphistä löytyy (VCL:n lähdekoodi) tällaista:
procedure WMPaint(var Message:TWMPaint) message WM_Paint;
Asiaa voit itse tutkia ajamalla ohjelmaasi Delphin integroidussa debuggerissa, ja sieltä:
View/ Debug Windows / CPU
Tällöin näet, millaista konekielikoodia Delphi mistäkin Objectpascal -koodinpätkästä tuottaa!
Toivottavasti asia tuli selväksi ! - kiinnostunut_dx
DelphiGuru kirjoitti:
"Voiko samassa luokassa käyttää
eri tapoja ristiin? Eli virtual toisessa metodissa ja dynamic toisessa?"
Kyllä voi!
mutta em. selitys oli tosiaan hieman pielessä.
Siis ne metodit, joita EI ole määritelty kummallakaan, sen paremmin virtual kuin dynamic -avainsanallakaan, niiden osalta kääntäjä laittaa suoraan oikean kutsuosoitteen paikalleen, joten ajoaikana kutsu on nopein mahdollinen eikä se vie ylimääräistä muistitilaakaan.
Valitettavasti tuon huono puoli on tämä:
type
TElain = class
procedure TuotaAani;
procedure Aantele;
end;
TKoira = class(TElain)
procedure TuotaAani;
end;
TKissa = class(TElain)
procedure TuotaAani;
end;
procedure TElain.TuotaAani;
begin
WriteLn('Oletusääni !!!');
end;
procedure TElain.Aantele;
begin
TuotaAani;
end;
procedure TKoira.TuotaAani;
begin
WriteLn('Hau !');
end;
procedure TKissa.TuotaAani;
begin
WriteLn('Miau !');
end;
Nyt jos teet näin:
var
Mirre : TKissa;
begin
Mirre := TKissa.Create;
Mirre.Aantele;
end;
Niin tuo ohjelma tulostaa:
Oletusääni !!!
Eli tuo Mirre.Aantele kutsuu suoraan TElain.Aantele
Ja koska TElain.Aantele -metodia ei ole muutettu muissa luokissa, se kutsuu aina TElain.TuotaAani;
Eli ohjelma ei toimi kuten käyttäjä ehkä olettaisi.
em. esimerkissä tuo TElain.TuotaAani;
pitää määritellä joko virtual tai dynamic -avainsanalla, ja vastaavasti TKoira.TuotaAani; ja TKissa.TuotaAani; override:llä.
Tällöin ohjelma toimii halutulla tavalla.
erona on tämä:
Jos käytät:
virtual;
-määrettä, niin sen luokan, jossa ko. metodi on määritelty, ja kaikkien siitä (suoraan tai välillisesti) perittyjen luokkien virtuaalimetoditaulukossa on tuon metodin luokkakohtainen toteutusosoite, eli siis erikseen:
TElain.TuotaAani;
TKoira.TuotaAani;
TKissa.TuotaAani;
Jos taas käytät dynamic -avainsanaa, silloin sen luokan, jossa ko. dynaaminen metodi on alunperin määritelty JA jokaisen sellaisen siitä (suoraan tai välillisesti) perittyjen luokkien, jossa ko. metodi on uudelleenmääritelty (override),
dynaamisten metodien taulukossa on tuon metodin luokkakohtainen toteutusosoite.
Tässä tapauksessa ei siis paljon eroa, mutta jos olisi vaikkapa:
TMustakissa = class(TKissa)
ja
TValkoinenKissa = class(TKissa)
ja oletetaan, että ko. TuotaAani; -metodia EI ole näissä uudelleenmääritelty, niin virtual -avainsanaa käytettäessä tulee virtuaalimetoditaulukkoon silti lisämerkinnät:
TMustakissa.TuotaAani;
TValkoinenKissa.TuotaAani;
Sensijaan dynamic -tapaa käytettäessä TMustakissa ja TValkoinenKissa -luokkiin EI tule merkintää TuotaAani; -metodista (koska sitä ei muutettu).
Siksi dynamic kuluttaa vähemmän muistitilaa, kun metodiosoitteita ei tarpeettomasti kopioida uusien perytettyjen luokkien taulukkoon jos ko. metodia ei ole ko. luokassa uudelleenmääritelty.
Mutta samasta syystä, koska dynamic -tavalla ei ole vakiopaikkaa mistä metodin koodin osoite löytyy, niin sen hakeminen on monimutkaisempi (ja siksi hitaampi) prosessi.
WIN32 -ympäristöstä en ole ihan varma, mutta aikanaan WIN16 -ympäristössä (= Delphi 1.0 ) oli muistaakseni niin, että message -avainsanalla saattoi määritellä käsittelijän windows -viesteille 0..32767 ja 16-bittiset arvot 32768..65535 oli varattu dynaamisten metodien käsittelylle.
Eli dynaamiset metodit ja suoramääritellyt windows -viestien käsittelijät oli rakennettu kääntäjän puolelta samalla tavalla, mutta arvoalue oli jaettu kahtia, toinen alue dynaamisten metodien ja toinen windows -viestikäsittelijöiden tarpeisiin.
Kun WIN32 -aikakaudella kokonaislukujen "luonnollisin" koko on 32 bittiä, tuo asia on hieman muuttunut.
Mutta edelleenkin Delphistä löytyy (VCL:n lähdekoodi) tällaista:
procedure WMPaint(var Message:TWMPaint) message WM_Paint;
Asiaa voit itse tutkia ajamalla ohjelmaasi Delphin integroidussa debuggerissa, ja sieltä:
View/ Debug Windows / CPU
Tällöin näet, millaista konekielikoodia Delphi mistäkin Objectpascal -koodinpätkästä tuottaa!
Toivottavasti asia tuli selväksi !Alla on sama koodi kuin delphin ohjeessa, kertoo aika hienosti dynaamisen ja virtuaalisen kutsun eron, mutta osaako joku tarkentaa noita asm-lauseita, tuo perus asm:n syntaksin ymmärrän, hallitsen monet ylemmät kielet 5v kokemuksella ja lähinnä siksi tässä yritän päästä kiinni tuohon delphin asm:iin, eli olen kommentoinut tuonne epäselvyyksiä suomeksi (Eng. Kieliset ovat D:n ohjeesta kopioitu).
type
TExample = class
procedure DynamicMethod; dynamic;
procedure VirtualMethod; virtual;
end;
...............
procedure TExample.DynamicMethod;
begin
end;
procedure TExample.VirtualMethod;
begin
end;
procedure CallDynamicMethod(e: TExample);
asm
// Save ESI register
PUSH ESI
// Instance pointer needs to be in EAX
MOV EAX, e
// MIKÄ ON JA MISTÄ TULEE: DMTINDEX //
// DMT entry index needs to be in (E)SI
MOV ESI, DMTINDEX TExample.DynamicMethod
// Now call the method
CALL System.@CallDynaInst
// Restore ESI register
POP ESI
end;
procedure CallVirtualMethod(e: TExample);
asm
// Instance pointer needs to be in EAX
MOV EAX, e
// MITÄ NUO "[]" HAKASULUT TUOSSA TEKEVÄT //
// Retrieve VMT table entry
MOV EDX, [EAX]
// VMTOFFSET JA NUO HAKASET ?//
// Now call the method at offset VMTOFFSET
CALL DWORD PTR [EDX VMTOFFSET TExample.VirtualMethod]
end;
procedure TForm1.Button1Click(Sender: TObject);
var
e: TExample;
begin
e := TExample.Create;
try
CallDynamicMethod(e);
CallVirtualMethod(e);
finally
e.Free;
end;
end; - Delphiguru
kiinnostunut_dx kirjoitti:
Alla on sama koodi kuin delphin ohjeessa, kertoo aika hienosti dynaamisen ja virtuaalisen kutsun eron, mutta osaako joku tarkentaa noita asm-lauseita, tuo perus asm:n syntaksin ymmärrän, hallitsen monet ylemmät kielet 5v kokemuksella ja lähinnä siksi tässä yritän päästä kiinni tuohon delphin asm:iin, eli olen kommentoinut tuonne epäselvyyksiä suomeksi (Eng. Kieliset ovat D:n ohjeesta kopioitu).
type
TExample = class
procedure DynamicMethod; dynamic;
procedure VirtualMethod; virtual;
end;
...............
procedure TExample.DynamicMethod;
begin
end;
procedure TExample.VirtualMethod;
begin
end;
procedure CallDynamicMethod(e: TExample);
asm
// Save ESI register
PUSH ESI
// Instance pointer needs to be in EAX
MOV EAX, e
// MIKÄ ON JA MISTÄ TULEE: DMTINDEX //
// DMT entry index needs to be in (E)SI
MOV ESI, DMTINDEX TExample.DynamicMethod
// Now call the method
CALL System.@CallDynaInst
// Restore ESI register
POP ESI
end;
procedure CallVirtualMethod(e: TExample);
asm
// Instance pointer needs to be in EAX
MOV EAX, e
// MITÄ NUO "[]" HAKASULUT TUOSSA TEKEVÄT //
// Retrieve VMT table entry
MOV EDX, [EAX]
// VMTOFFSET JA NUO HAKASET ?//
// Now call the method at offset VMTOFFSET
CALL DWORD PTR [EDX VMTOFFSET TExample.VirtualMethod]
end;
procedure TForm1.Button1Click(Sender: TObject);
var
e: TExample;
begin
e := TExample.Create;
try
CallDynamicMethod(e);
CallVirtualMethod(e);
finally
e.Free;
end;
end;1. Dynaamisista metodeista:
Aina, kun lähdekoodissa metodin määrittelyssä käytetään dynamic -avainsanaa, niin Delphi lisää yhden tietueen ohjelman dynaamisten metodien taulukkoon.
Tuossa taulukossa on siis jokaista dynaamista metodia kohden ainakin:
a) metodin kutsuosoite
b) metodin dynaaminen indeksi
tuo b) voi alkaa nollasta tai ykkösestä, en tiedä kummasta alkaa, mutta jokainen uusi määritelty dynaaminen metodi luo siis yhden uuden tietueen tuohon (=alkion) tuohon taulukkoon ja tuossa uudessa tietueessa tuo indeksi on yhtä suurempi kuin edellisen taulukon tietueen indeksi.
tuo DMTINDEX siis kuvaa tuota indeksiä.
Eli tuo
MOV ESI, DMTINDEX TExample.DynamicMethod
lataa ESI -rekisteriin metodia TExample.DynamicMethod kuvaavan dynaamisen indeksin, jonka perusteella System.@CallDynaInst -proseduuri etsii ko. dynaamisen metodin osoitteen dynaamisten metodien taulukosta ja jos osoite löytyy, hyppää ko. osoitteeseen.
Tosin, jos mietit hetken, huomaat, että tuo oli tietyssä mielessä yksinkertaistettu esitys.
Jos olisit periyttänyt TExample -luokkasi toisesta luokasta, jossa olet määritellyt ko. dynaamisen metodin ja TExample -luokassa itsessään et olisi uudelleenmääritellyt sitä, olisi koodi näyttänyt hieman toiselta (luonnollisesti).
2.
"MITÄ NUO "[]" HAKASULUT TUOSSA TEKEVÄT"
// Retrieve VMT table entry
MOV EDX, [EAX]
siis...
mov EDX, EAX (ilman hakasulkuja) kopioisi rekisterin EAX arvon rekisteriin EDX.
sensijaan MOV EDX, [EAX] taas kopioi sen muistipaikan sisällön, johon EAX osoittaa, rekisteriin EDX.
Eli siis:
mov EDX,EAX ei koskaan aiheuta poikkeusta.
Sensijaan MOV EDX, [EAX] aiheuttaa poikkeuksen, jos EAX ei osoita kelvolliseen muistiosoitteeseen.
...
"VMTOFFSET JA NUO HAKASET"
// Now call the method at offset VMTOFFSET
CALL DWORD PTR [EDX VMTOFFSET]
niin, siis tässä EDX osoittaa VMT (=Virtual Method Table) -taulukon alkuun, ja VMTOFFSET on offsetti VMT -taulukon sisällä, josta löytyy ko. metodin alkuosoite.
Ja jälleen kerran, hakasulut kuvaavat (kuten assemblerissa yleensäkin), muistiosoitusta.
Eli siis CALL -käskyn osalta tarkoittaa siis sitä, että rekisterin EDX sisältö ja tuo luku, jota kuvataan symbolilla VMTOFFSET lasketaan kyllä yhteen, mutta EI kutsuta yhteenlaskun tuloksen osoittamaa osoitetta, vaan sensijaan käytetään tuon yhteenlaskun tulosta muistiosoitteena, josta haetaan se osoite, jota kutsutaan.
Mutta esim. C -kieleen verrattuna assemblerinkin syntaksi on sentään vielä aika selkeää. - kiinnostunut_dx
Delphiguru kirjoitti:
1. Dynaamisista metodeista:
Aina, kun lähdekoodissa metodin määrittelyssä käytetään dynamic -avainsanaa, niin Delphi lisää yhden tietueen ohjelman dynaamisten metodien taulukkoon.
Tuossa taulukossa on siis jokaista dynaamista metodia kohden ainakin:
a) metodin kutsuosoite
b) metodin dynaaminen indeksi
tuo b) voi alkaa nollasta tai ykkösestä, en tiedä kummasta alkaa, mutta jokainen uusi määritelty dynaaminen metodi luo siis yhden uuden tietueen tuohon (=alkion) tuohon taulukkoon ja tuossa uudessa tietueessa tuo indeksi on yhtä suurempi kuin edellisen taulukon tietueen indeksi.
tuo DMTINDEX siis kuvaa tuota indeksiä.
Eli tuo
MOV ESI, DMTINDEX TExample.DynamicMethod
lataa ESI -rekisteriin metodia TExample.DynamicMethod kuvaavan dynaamisen indeksin, jonka perusteella System.@CallDynaInst -proseduuri etsii ko. dynaamisen metodin osoitteen dynaamisten metodien taulukosta ja jos osoite löytyy, hyppää ko. osoitteeseen.
Tosin, jos mietit hetken, huomaat, että tuo oli tietyssä mielessä yksinkertaistettu esitys.
Jos olisit periyttänyt TExample -luokkasi toisesta luokasta, jossa olet määritellyt ko. dynaamisen metodin ja TExample -luokassa itsessään et olisi uudelleenmääritellyt sitä, olisi koodi näyttänyt hieman toiselta (luonnollisesti).
2.
"MITÄ NUO "[]" HAKASULUT TUOSSA TEKEVÄT"
// Retrieve VMT table entry
MOV EDX, [EAX]
siis...
mov EDX, EAX (ilman hakasulkuja) kopioisi rekisterin EAX arvon rekisteriin EDX.
sensijaan MOV EDX, [EAX] taas kopioi sen muistipaikan sisällön, johon EAX osoittaa, rekisteriin EDX.
Eli siis:
mov EDX,EAX ei koskaan aiheuta poikkeusta.
Sensijaan MOV EDX, [EAX] aiheuttaa poikkeuksen, jos EAX ei osoita kelvolliseen muistiosoitteeseen.
...
"VMTOFFSET JA NUO HAKASET"
// Now call the method at offset VMTOFFSET
CALL DWORD PTR [EDX VMTOFFSET]
niin, siis tässä EDX osoittaa VMT (=Virtual Method Table) -taulukon alkuun, ja VMTOFFSET on offsetti VMT -taulukon sisällä, josta löytyy ko. metodin alkuosoite.
Ja jälleen kerran, hakasulut kuvaavat (kuten assemblerissa yleensäkin), muistiosoitusta.
Eli siis CALL -käskyn osalta tarkoittaa siis sitä, että rekisterin EDX sisältö ja tuo luku, jota kuvataan symbolilla VMTOFFSET lasketaan kyllä yhteen, mutta EI kutsuta yhteenlaskun tuloksen osoittamaa osoitetta, vaan sensijaan käytetään tuon yhteenlaskun tulosta muistiosoitteena, josta haetaan se osoite, jota kutsutaan.
Mutta esim. C -kieleen verrattuna assemblerinkin syntaksi on sentään vielä aika selkeää.Paljon kiitoksia, erittäin selkeästä ja ymmärrettävästä vastauksesta!
Ketjusta on poistettu 0 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
Ja taas ammuttu kokkolassa
Kokkolaisilta pitäisi kerätä pois kaikki ampumaset, keittiöveitset ja kaikki mikä vähänkään paukku ja on terävä.354289Kuinka kauan
Olet ollut kaivattuusi ihastunut/rakastunut? Tajusitko tunteesi heti, vai syventyivätkö ne hitaasti?1141586Milli-helenalla ongelmia
Suomen virkavallan kanssa. Eipä ole ihme kun on etsintäkuullutettu jenkkilässäkin. Vähiin käy oleskelupaikat virottarell2481546Helena Koivu on äiti
Mitä hyötyä on Mikko Koivulla kohdella LASTENSA äitiä huonosti . Vie lapset tutuista ympyröistä pois . Lasten kodista.2181400- 351266
Ja taas kerran hallinto-oikeus että pieleen meni
Hallinto-oikeus kumosi kunnanhallituksen päätöksen vuokratalojen pääomituksesta. https://sysmad10.oncloudos.com/cgi/DREQ881078Löydänköhän koskaan
Sunlaista herkkää tunteellista joka jumaloi mua. Tuskin. Siksi harmittaa että asiat meni näin 🥲1321072Kun näen sinut
tulen iloiseksi. Tuskin uskallan katsoa sinua, herätät minussa niin paljon tunteita. En tunne sinua hyvin, mutta jotain471054Purra saksii taas. Hän on mielipuuhassaan.
Nyt hän leikkaa hyvinvointialueiltamme kymmeniä miljoonia. Sotea romutetaan tylysti. Terveydenhoitoamme kurjistetaan. ht2671031- 62994