Dies auf einem niedrigeren Niveau möglich ist, wenn Sie Montag mit c verflechten, und von dort aus einem C++ Compiler mit C zu verwenden und dann C++ verwenden, und dass eine Form der Reflexion sein könnte.
Die Funktionsweise funktioniert über die Funktionsadressen. Betriebssysteme randomisieren die Adressen, und dann können die Variablen entsprechend platziert werden, wie heapAddress + 1
, heapAddress + 2
, usw. Dies funktioniert auch für Funktionen.
Der DNS ist der Domain Name Server in der Welt des Internets. Es interpretiert einen Domain-Namen wie http://www.example.com/
zu einer IP-Adresse, sagen wir vielleicht 10.87.23.9/
(IPs beginnend mit 10 sind in der Regel private Netzwerke). Sie könnten die @ LiHO-Idee verwenden und stattdessen eine Karte, aber die Funktionsadressen erstellen. Auch dies ist ein sehr niedriges Niveau, nicht einmal auf C++ - Ebene und ziemlich involviert. Mit einer Karte der Adressen, gegeben einer Schnur, konnten Sie sie möglicherweise zu einer Adresse durch Verweise auf ein Array von long oder int decodieren.
Nachdem Sie diese Adresse dekodiert haben, müssen Sie die binären Anweisungen zur Ausführung in die CPU-Register setzen. Ob Sie sich für die Verwendung von Assembly oder C entscheiden, hängt davon ab, was Sie tun. Sie könnten einen Operanden-Stack-Ansatz verwenden und C verwenden, um jeden Befehl mit seinen Parametern auszuführen, oder Sie können assembly verwenden, um die Befehle, die Daten oder beide in die Register einer CPU zur Ausführung zu bringen.
Hier ist, wie ich würde es codieren (vorausgesetzt, dies ist Pseudocode):
Sprache C/C++ Header-Datei:
//reflection.h
#pragma once
class Reflection {
public:
extern "C" {
static void exec(int& func_addr);
}
}
Sprache C++:
//mysourcefile.cpp
#pragma once
#include "reflection.h"
#include "map.h"
int main(){
Map map;
Reflection.exec(map.decode("run()"); // executes a function called run() in the current class
wait(10);//seconds
return 0;
}
void run(){
cout<<"This is now running via reflection from an assembly procedure in a C function in a C++ function!";
}
Ausgang:
Dies wird jetzt über Reflektion von einer Assembly-Prozedur in einer C-Funktion in einer C++ - Funktion ausgeführt n!
Sie können das leicht verbessern, indem Sie std :: function verwenden und der Initialisierer listet die Syntax auf. –
@LokiAstari: 'std :: function' ist C++ 11 ich denke. – LihO
@LihO: Ich mag deinen Ansatz. Vielen Dank. –