Rückgabe und Übergabe
-
Nachfolgend eine kleine Klasse zur Verwaltung von Schachzügen:
//// //// move class //// class Move { public: // constants static const int MOVE_NONE = 0; static const int MOVE_MASK = 0x1FFF; // functions void to_string(char * string) const; // get move information inline int move(void) const { return m; } inline int to(void) const { return m & 63; } inline int from(void) const { return (m >> 6) & 63; } inline int piece_promoted(void) const { return (m >> 12) & 7; } // get move flags inline bool is_promotion(void) const { return (m & IS_PROMOTION) != 0; } inline bool is_enpassant(void) const { return (m & IS_ENPASSANT) != 0; } inline bool is_castle(void) const { return (m & IS_CASTLE) != 0; } inline bool is_promotion_enpassant_castle(void) const { return (m & (IS_PROMOTION | IS_ENPASSANT | IS_CASTLE)) != 0; } // make moves static inline int make_move(int from, int to) { return to + (from << 6); } static inline int make_promotion(int from, int to, int piece_promoted) { return to + (from << 6) + (piece_promoted << 12); } static inline int make_enpassant(int from, int to) { return to + (from << 6) + IS_ENPASSANT; } static inline int make_castle(int from, int to) { return to + (from << 6) + IS_CASTLE; } private: // flags static const int IS_PROMOTION = 7 << 12; static const int IS_ENPASSANT = 1 << 15; static const int IS_CASTLE = 1 << 16; // move int m; };Da die Klasse nur 4 Byte gross ist, kann ich doch vollkommen problemlos call by value machen. Sehe ich es richtig, dass die Verwendung dieser Klasse genauso schnell gehen sollte, wie die Verwendung eines einfachen Integers?
Wenn dem so ist, kann ich auch Klassen als Rückgabewerte aus Funktionen herauskopieren?
Danke!
PS: Ich weiss, es fehlt der Konstruktor. Ist auch noch im Bau...
-
Es gibt für den Extremfall auch Referenzen...
-
Habe zwar nicht viel mit Programmieren zu tun, aber
1. das weiss ich auch
2. das war nicht meine FrageDanke!
-
Tomahawk schrieb:
Da die Klasse nur 4 Byte gross ist, kann ich doch vollkommen problemlos call by value machen.
Da du einen trivialen Konstruktor hast: Ja.
Sehe ich es richtig, dass die Verwendung dieser Klasse genauso schnell gehen sollte, wie die Verwendung eines einfachen Integers?
Da du einen trivialen Konstruktor hast: Ja.
Wenn dem so ist, kann ich auch Klassen als Rückgabewerte aus Funktionen herauskopieren?
Ja.
PS: Ich weiss, es fehlt der Konstruktor. Ist auch noch im Bau...
Na, toll. Vergiss meine obigen Antworten, bis ich die Konstruktoren gesehen habe.
P.S.:
Ich habe den Eindruck, dass du dich viel zu sehr mir verfrühter Mikrooptimierung aufhälst. Dein Schachprogramm hast du schon vor Monaten angefangen. Du wärest längst fertig, wenn du erstmal programmiert hättest, dann mit einem Profiler die teuerste Funktion gesucht hättest und diese optimiert hättest. Das Ergebnis wäre genauso schnell und viel zuverlässiger als alles was du mit deiner jetzigen Vorgehensweise in den nächsten Monaten erreichen wirst.
-
SeppJ schrieb:
Ich habe den Eindruck, dass du dich viel zu sehr mir verfrühter Mikrooptimierung aufhälst. Dein Schachprogramm hast du schon vor Monaten angefangen. Du wärest längst fertig, wenn du erstmal programmiert hättest, dann mit einem Profiler die teuerste Funktion gesucht hättest und diese optimiert hättest. Das Ergebnis wäre genauso schnell und viel zuverlässiger als alles was du mit deiner jetzigen Vorgehensweise in den nächsten Monaten erreichen wirst.
Ich hab´ da grad ein Deja Vue ...