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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

21

23.05.2008, 16:00

es haben aber auch schon viele oft das gegenteil behauptet...
es wird wohl in beiden fällen auf etwas wie ein lea hinauslaufen. ich denk also dass es ziemlich egal sein dürfte was man verwendet...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

22

23.05.2008, 16:18

Es kommt natürlich auf den jeweiligen Compiler an, was er aus der Sache macht. Es gibt mit sicherheit Fälle bei denen die Zeigervariante schnellere Ergebnisse bringt. Aber meistens kann man dem Optimierer durch die verwendung vom []-Operator helfen in dem man explizit mögliches 'Aliasing' reduziert. Dem Optimierer ist ja nicht klar (zumindest nicht ohne aufwendige Analyse) ob *p und *q auf den selben Speicher referenzieren oder nicht. Bei x[0] und x[1] z.B. ist das aber durchaus klar.
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

23

23.05.2008, 16:21

das stimmt natürlich

24

23.05.2008, 16:30

@David_pd:

Zitat

Aber der new[]-Operator streikt wenn dein Objekttyp keinen Standardkonstruktor hat.


Dann definiert man sich einen :-). Bevor man mit selten genutzten Sprachfeatures wie placement new herumspielt, sollte man erstmal versuchen darauf zu verzichten. Fuer das gegebene Problem fallen mir spontan 2 verschiedene Moeglichkeiten ein.

Zitat

Aber das Problem ist ja nicht immer vorhanden. Das Nullsetzen eines Zeigers in einem Destruktor macht z.B., im Allgemeinen, keinen wirklichen Sinn.


Ich wuerde es mal so formulieren: Das Problem besteht immer, ausser in einigen Sonderfaellen :-). Wobei der Compiler dann pPlayer = 0 wegoptimiert. Und dass das ein Flaschenhals mal werden sollte, schwer vorzustellen.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

25

23.05.2008, 16:33

Zitat von »"knivil"«

@David_pd:

Zitat

Aber der new[]-Operator streikt wenn dein Objekttyp keinen Standardkonstruktor hat.


Dann definiert man sich einen :-). Bevor man mit selten genutzten Sprachfeatures wie placement new herumspielt, sollte man erstmal versuchen darauf zu verzichten. Fuer das gegebene Problem fallen mir spontan 2 verschiedene Moeglichkeiten ein.


Und dann? Dann hast du Code der auf den ersten Blick nicht das tut was man erwartet...

Zitat von »"knivil"«


Zitat

Aber das Problem ist ja nicht immer vorhanden. Das Nullsetzen eines Zeigers in einem Destruktor macht z.B., im Allgemeinen, keinen wirklichen Sinn.


Ich wuerde es mal so formulieren: Das Problem besteht immer, ausser in einigen Sonderfaellen :-). Wobei der Compiler dann pPlayer = 0 wegoptimiert. Und dass das ein Flaschenhals mal werden sollte, schwer vorzustellen.


Du hast schon recht. Meißtens macht es Sinn. Aber in manchen Fällen nicht. Und in diesen Fällen will ich in meinem Code keine unnötigen Codezeilen stehen haben, egal ob sie wegoptimiert werden oder nicht.
@D13_Dreinig

26

23.05.2008, 16:35

Zitat von »"dot"«

der standard definiert das verhalten von a als gleichbedeutend mit *(a + b).
da a + b das gleiche ist wie b + a folgt daraus direkt dass a[b] das gleiche ist wie b[a]...


Hierzu haette ich gern mal eine Referenz, ansonsten wuerde ich es mal als Falsch abtun.

Sei A ein Array von Objekten des Typs O, so mag ich mich erinnern, dass folgendes gilt:

Quellcode

1
2
3
4
5
A[i] = *(A + sizeof( O ) * i)
 
//syntax     // byte ebene
*(A + i) = *(A + sizeof( O ) * i) 
*(i + A) = *(i + sizeof( i ) * A)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

27

23.05.2008, 16:41

Zitat von »"knivil"«

Hierzu haette ich gern mal eine Referenz, ansonsten wuerde ich es mal als Falsch abtun.


Zitat von »"C++ Standard 2003 §5.2.1"«


[...] The type “T” shall be a completely-defined object type.The expression E1[E2] is identical (by definition) to *((E1)+(E2)).


das mit dem sizeof stimmt übrigens nicht, da die größe der objekte bereits in der pointerarithmetik berücksichtigt wird.

28

23.05.2008, 16:43

Habe ich ja auch nie was anderes Behauptet, nur vertauschen darf man sie halt nicht. Gib mir doch mal nen clicky :-).

Zur Groesse, kA, aber mein Compiler weiss wo das naechste Objekt A liegt, wie er das Organisiert, ist seine Sache.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

29

23.05.2008, 16:45

ich hab den link leider verloren. abrexxes hat ihn hier irgendwo irgendwann mal gepostet...

man darf sie sehr wohl vertauschen. wenn dus nicht glaubst probiers halt aus...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

30

23.05.2008, 16:48

http://www.hep.wisc.edu/~pinghc/isocppstd/expr.html <- !
@D13_Dreinig

Werbeanzeige