Simulacia instukcii – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Simulacia instukcii – C / C++ – Fórum – Programujte.comSimulacia instukcii – C / C++ – Fórum – Programujte.com

 

vitamin+8
Grafoman
8. 4. 2012   #1
-
0
-

Programujem si scriptovaci jazyk ktory sa kompiluje do byte kodu. Samotny kod sa sklada z nasledujuceho vektora zlozeneho z tejto struktury:

struct VM_Command{		//velkosti a rozlozenie premennych je ilustracne
	u_int8_t  instrukcia;
	
	u_int64_t ine_data;
};

premenna instrukcia obsahuje identyfikator (index) instrukcie. Napadli ma 2 moznosti:

1. Kazda instrukci bude reprezentovana funkciou, dalej bude vytvorene pole pointrov na funkcie ku ktorim sa bude pristupovat pomocou indexu (u_int8_t  instrukcia). Tieto funkcie budu cyklicky volane z jednej hlavnej funkcie. Toto riesenie ma nevyhodu vo velkej rezii pri volani funkcii:

bool (*Instrukcia)(Threat *threat);

bool A(Threat *t){/*instukcia A*/}
bool B(Threat *t){/*instukcia B*/}
bool C(Threat *t){/*instukcia C*/}

void main(){
        Threat t;
	vector<VM_Command> prikazy;
	Instrukcia instukcie[25];

	instukcie[0] = A;
	instukcie[1] = B;
	instukcie[2] = C;
       /*
           ...
    
        */


   	for(auto &i : prikazy)
	    instrukcie[i.instukcia](&t);

}

2. Kazda funkcia bude mat identyfikator (napr cez enum) a vykonavat sa bude priamo v hlavnej funkcii kde sa spravna cast bude vyberat cez switch:

enum Inst{ A, B, C /*...*/};
int main(){
   Threat t;
   vector<VM_Command> prikazy;

   for(auto &i : prikazy)
	switch(i.instrukcia){
	    case Inst::A:
		//instukcia A
		break;
	    case Inst::B:
		//instukcia B
		break;

	    /*
		...

		*/
	}
}

V 2. casti zas neviem povedat prekladacu nech implementuje switch pomocou jump-tables.

Ktora moznost je rychlejsia, pripadne su aj ine moznosti ako to implementovat?

Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
zlz
~ Anonymní uživatel
634 příspěvků
8. 4. 2012   #2
-
0
-

Toto riesenie ma nevyhodu vo velkej rezii pri volani funkcii

To ti řekl kdo?

Ktora moznost je rychlejsia

Zkus to změřit.

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 33 hostů

Podobná vlákna

Simulacia bankomatu — založil kani

Simulacia vlaku — založil Rybicka

Simulácia SpaceBaru — založil Vransky

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý