Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

25.08.2006, 13:58

Wie kann ich einem Member-Function-Pointer nen Wert zuweisen

Hallo an alle,
ich habe folgendes Problem:

ich möchte abhängig von den Features der CPU meine Klassenfunktionen optimieren. Das könnte ich ja folgendermaßen tun:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
class Vector3
{
public:
    float x;
    float y;
    float z;

    Vector3(){}

    float Length(void);
};


und dann beim deklarieren:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
float Vector3::Length(void) 
{ 
    if(bSSE)
    {
        __asm
        {
            // Assemblercode
        }
    }
    else if(b3DNOW)
    {
        __asm
        {
            // Assemblercode
        }
    }
    // usw
    else
    {

        return sqrtf(x*x + y*y + z*z);
    }
}


So. Nun möchte ich aber nicht dass bei jedem Aufruf von Length() der ganze if/else-Kram ausgeführt wird (natürlich nur bis zum ersten TRUE, aber nehmen wir mal an meine CPU hat gar keine Features).
Da hab ich mir gedacht, dass ich das mit Funktionszeigern machen könnte. Z.B. so:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
class Vector3
{
public:
    float x;
    float y;
    float z;

    rlVector4(){}

    float (*Length)(void);
};


und dann am Anfang des Programms (also bei der Abfrage der Features) Length eine Funktion zuweise, wie z.B.: Length = &LengthSSE oder so ähnlich. Nur funktioniert das leider nicht so leicht. Hat einer von euch vielleicht eine Idee???

Danke (schon im Voraus)
Delorian

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

25.08.2006, 14:19

jepp, generell SSE2 bzw. SSE3 nutzen. Das können sowohl neuen AMD als auch die INTEL Cores :).
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

25.08.2006, 16:25

Re: Wie kann ich einem Member-Function-Pointer nen Wert zuwe

Zitat von »"delorian0815"«

[...] Nur funktioniert das leider nicht so leicht. Hat einer von euch vielleicht eine Idee??? [...]

Doch, das ist einklich ganz leicht: Du legst für alle Methoden, die du optimieren möchtest, einen Funktionszeiger an und verweist dann auf die entsprechende optimierte Funktion.
Wo genau hast du denn Probleme mit...?
Kommen Sie nie mit einem Schwert zu einer Schießerei.

4

25.08.2006, 16:54

Das Problem ist, dass ich z.B. bei der Methode Length auf die Membervariablen x, y, und z zugreifen muss. Wenn ich jetzt eine Funktion schreibe, kann ich ja x, y und z nicht benutzen, weil noch keine Instanz erstelle wurde.

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

5

28.08.2006, 09:42

und wieso machst dus nicht mit #ifdef ?
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

28.08.2006, 11:04

Ich würde von Funktionszeigern abraten.
Da geht sehr viel Geschwindigkeit verloren, weil der Compiler nicht inlinen kann (so wie bei virtuellen Methoden).
Am besten schreibst du separate Klassen für FPU, 3DNow!, SSE etc. und erzeugst am Ende mehrere EXEs, jeweils mit dem entsprechenden Befehlssatz.
Das mit den Funktionszeigern lohnt sich nur bei "größeren Funktionen", die z.B. direkt tausende Vektoren transformieren oder sowas in der Art.

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

7

28.08.2006, 11:06

Zitat von »"Black-Panther"«

und wieso machst dus nicht mit #ifdef ?

Weil er vermutlich zur Laufzeit überprüft, ob eine CPU das notwendige feature unterstützt?

So könntest du es z.B bewerkstelligen

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>

class Vector
{
  void func_impl_a() {std::cout << "func a";}
  void func_impl_b() {std::cout << "func b";}

  void  (Vector::*pfunc)();

public:
  Vector()
  {
    bool usefunca = false;
    if(usefunca)
      pfunc=&Vector::func_impl_a;
    else
      pfunc=&Vector::func_impl_b;
  }

  void func()
  {
    (this->*pfunc)();
  }
};

int main()
{

  Vector x;
  x.func();            
  getchar();
  return 0;
}

mfg Philipp

8

28.08.2006, 23:14

Also erst mal vielen dank an alle Helfenden,

ich werde mal schauen, wie ich es nun machen werde. Vieleicht kann ich auch eine Klasse schreiben und die Methoden dann in verschiedenen DLLs implementieren (für jedes Feature eine). Aber da kenn ich mich noch nicht so aus. Ich werde also mal weiterprobieren.

9

29.08.2006, 15:13

.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FOGX« (15.09.2010, 16:29)


Werbeanzeige