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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

41

02.04.2015, 11:28

Speicheroverhead? Im Ernst? Das sollte nun echt der letzte Grund sein sich für einen Raw Array zu entscheiden.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

42

02.04.2015, 13:36

Ein weiterer Vorteil von normalen Arrays (+ Längenangabe) ist, dass man ohne Probleme Subarrays übergeben kann. Und man kann auch statisch gespeicherte Daten übergeben.
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

43

02.04.2015, 14:04

Ein weiterer Vorteil von normalen Arrays (+ Längenangabe) ist, dass man ohne Probleme Subarrays übergeben kann. Und man kann auch statisch gespeicherte Daten übergeben.

Naja, dafür gibt es doch iteratoren. Da bin ich sogar flexibel in welche Richtung iteriert wird und es ist egal, welchen Container ich nutze. Davon bekommt die aufzurufende Funktion einfach überhaupt nichts mit.
Sehe keinen wirklichen Grund, rohe Arrays zu nutzen.

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

44

02.04.2015, 14:09

Naja, dann musst du aus deiner ganzen Funktion ja ein template machen.
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

45

02.04.2015, 14:12

So komfortabel wie C# ist C++ nicht wenn der Code mit verschiedenen Datenstrukturen verwendbar sein soll. Dafür kann man bei C# leichter ausversehen ineffiziente Konstruktionen produzieren, besonders wenn LINQ im Spiel ist. Aus der Funktion ein Template zu machen und Iteratoren anzunehmen scheint mir da noch die beste Option zu sein. Auch wenn das evtl. nicht immer passt, wie schon von BC geschrieben.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

46

02.04.2015, 14:16

Ist halt wie immer von Fall zu Fall unterschiedlich. Mal macht das eine Sinn, mal das andere.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

47

02.04.2015, 14:21

@Legend
Wie schon mehrmals erläutert scheinen mir in den meisten Fällen die Möglichkeit ausgefallene Container zu übergeben total überflüssig.
Das Problem ist meistens doch eher akademisch und wer nicht gerade an einer Library wie Boost arbeitet, braucht nicht aus allem ein Template machen und seine Compilezeiten explodieren zu lassen.

In C# ist die Iteration halt sehr eingeschränkt. Da gibt es keinen bidirektionalen Iterator und alles ist virtuell. Das passt nicht in die Welt von C++ mit Zero Overhead. Du kannst auch in C++ Klassen schreiben die über virtuelle Funktionen iterieren. Der Overhead ist bloß im Vergleich so groß, das macht keiner. Und letzendlich bloß um eine std::list verwenden zu können die mit hoher Wahrscheinlichkeit in dem Fall sowieso ineffizient wäre. Man könnte natürlich eine Klasse schreiben um den Zeiger + Länge(bzw. Endzeiger) schön zu kapseln und BlueCobolds Kritik zum Komfort zu beheben. Das wäre eigentlich eine gute Idee.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (02.04.2015, 14:26)


buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

48

02.04.2015, 15:19

Vielleicht bin ich ja echt aus der Steinzeit, aber gibt es noch Leute die so etwas machen?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Particle {
  vec3 pos;
  vec3 vel;
  float rotation;
  // .....
};

class ParticleSystem {

typedef std::vector<Particle> Particles;

public:
  ParticleSystem();
 //....
private:
  Particles m_Particles;
}

Das ist ein Fall wo man ja ständig immer irgendwo etwas löscht, weil Particle ihr Lebensende erreichen.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

49

02.04.2015, 15:39

Ja klar gibt es die.
Wieso sollte Löschen ein Problem sein?
Das ist ein typisches Beispiel für einen Container bei dem die Reihenfolge der Objekte egal ist. Somit kann man effizient aus dem std::vector löschen, in dem man das letzte Element zum eigentlich zu löschenden Element schiebt und dann das letzte Element löscht. Eine std::list wäre grauendvoll ineffizient, weil häufig über die Partikel iteriert werden muss.

Während ein eigener Container durchaus Vorteile gegebenüber dem std::vector bringen kann, so ist er hier nicht das Hauptproblem. Sinnvoll wäre die Verwendung von Datenorientierung und die ist theoretisch auch kompatibel mit dem std::vector.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (02.04.2015, 16:04)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

50

02.04.2015, 20:06

Man könnte natürlich eine Klasse schreiben um den Zeiger + Länge(bzw. Endzeiger) schön zu kapseln und BlueCobolds Kritik zum Komfort zu beheben. Das wäre eigentlich eine gute Idee.
Die Idee hatte sogar schon mal jemand. Nennt sich std::vector.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige