array of structs oder classe/struct of arrays



  • Hallo, mein Prof meinte ich soll eine Datenstruktur array of structs machen. Ich habe, allerdings bei Fortran, gehört dass array von structs schlechter ist als umgekehrt. Ist es bei C/C++ auch so oder ist es im Prinzip egal?



  • Das kommt darauf an, wie du es verwendest. Einfaches Beispiel:

    Vertex {
     x
     y
     z
    };
    

    In den meisten fällen wirst du mit x nichts Anfangen können ohne y und z. Gehst du durch ein Array of structs hast du xyzxyzxyz... und hast somit alles gleich Beisammen.

    Anderes beispiel:

    Entity {
     name
     position
     level
     ability
    };
    

    Wenn du die Position von allen Entities updaten möchtest brauchst du dazu den namen, das level und die abilities nicht. Hier wäre ein Struct of Arrays angebrachter, damit du nicht 70% Daten aus dem Ram lädst die du dann garnicht nutzt.



  • Es gilt auch: Array of structs ist saubere Programmierung.
    Manchmal muss man aber aufgrund von Geschwindigkeit etwas unsauberer arbeiten und zu struct of arrays greifen, wobei ich das bisher eigentlich nie gebraucht habe.



  • Wieso?

    Zur Not kapselst du das in einer Klasse weg und niemand siehts.

    struct Foo
    {
    	int a;
    	double b;
    };
    
    class Together
    {
    	std::vector<Foo> foos;
    
    public:
    	void push(Foo const& f)
    	{
    		foos.push_back(f);
    	}
    
    	Foo get(std::size_t i)
    	{
    		return foos[i];
    	}
    };
    
    class Splitted
    {
    	std::vector<int> fooAs;
    	std::vector<double> fooBs;
    
    public:
    	void push(Foo const& f)
    	{
    		fooAs.push_back(f.a);
    		fooBs.push_back(f.b);
    	}
    
    	Foo get(std::size_t i)
    	{
    		return {fooAs[i], fooBs[i]};
    	}
    };
    

    So in etwa, natürlich erfordert das an einigen Stellen etwas Aufwand, aber wenns sich für die Performance lohnt, wieso nicht?



  • Namal schrieb:

    Ich habe ... gehört dass array von structs schlechter ist als umgekehrt.

    Da fehlt das weil im Satz. Wenn jemand so etwas sagt, sollte er das auch begründen. Wenn er das nicht kann, solltest du seine Ratschläge ignorieren.


Anmelden zum Antworten