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

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

1

21.05.2009, 21:34

mem... vs. forschleife

Hi wollte mal fragen was schneller und besser ist memset() ,memcpy()
oder direkt eine Schleife.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
int arr[512];

memset(&arr,0,512);

//oder


for(size_t i = 0;i < 512;i++){
  arr[i] = 0;
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
int arr[512];
int arr2[512];

memcpy(&arr,&arr,512);

//oder


for(size_t i = 0;i < 512;i++){
  arr[i] = arr2[i];
}

2

21.05.2009, 21:56

nun, man soltle im allgemeinen davon ausgehen, das Bibliotheksfunktionen schneller sidn als eigene Schleifen, falls das überhaupt möglich ist, außerdem sind sie i.d.R. kürzer zu schreiben.
Allerdings ignorieren die beiden benutzerdefinierte copy-operators, sprich, es gibt probleme bei klassen, die sich auf diese verlassen. Das Problem hat std::copy() bzw. std::fill() nciht, dank templates (muss man ncith verstehen um sie zu benutzen).
Also würde ich sagen: am besten std::copy() und std::fill() benutzen

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

3

22.05.2009, 11:10

Gibt es solche Funktionen auch für Eindeminsionale Array als 3Dim.
Besonder wenn diese verschidene Größen haben.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
int px[512*512*4];
int px2[256*512*4];

for(uint x = 0;x < 256;x++){
  for(uint y = 0;y <512;y++){
    for(uint bpp = 0;bpp < 4;bpp++){
       px[4*(x + y * 512)+bpp] = px2[4*(x + y * 256)+bpp];
    }
  }
}

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

22.05.2009, 11:48

eine mem* funktion wird ab gewissen größen deutlich schneller sein als eine schleife. für kleinere sachen ist aber auch eine schleife in ordnung weil es doch irgendwo "logischer" ist jedes element einzeln zu setzen und das ist speedmäßig nicht bemerkbar (bei den heutigen "flitzeprozis").

Zitat von »"kiba"«

Gibt es solche Funktionen auch für Eindeminsionale Array als 3Dim.
Besonder wenn diese verschidene Größen haben.


nein^^. n-dimensionale felder sind ja auch linear im speicher. je nachdem wie es angeordnet ist, muss man das dann mit schleifen machen oder kann kleinere blöcke des feldes kopieren mit memfunktionen und einer oder mehreren schleifen.

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

5

22.05.2009, 13:06

Also einfach:
( Wichtig ! du hast oben vergessen noch die Größe des Typen "int" zu berücksichtigen ! dazu einfach mit sizeof(int) multiplizieren )

C-/C++-Quelltext

1
2
3
4
int px[512*512*4];
int px2[512*512*4]; 

memcpy(&px,&px2,512 * 512 * 4 * sizeof(int) );

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

6

22.05.2009, 13:59

Die Postitionen sind doch anders
er würde dann doch davon ausgehen das px2 ein Breite von 512 hat.
oder nicht.

7

22.05.2009, 15:30

in so einem fall wird dir wohl außer ner schleife ncith viel übrigbleiben ;)

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

8

22.05.2009, 23:58

Hmmm Tatsache....wenn du nur einen Teil copieren willst, wirst du um ne Schleiufe nicht herrumkommen....
aber in dieser schleife kannste ja memcpy benutzen

9

23.05.2009, 15:57

Probiert mal Zeiger in den Schleifen aus ... dann kommt ihr auf nahezu gleiche Werte wie memset etc. ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

10

24.05.2009, 19:37

Naja, memcpy und so sind schon alleine deshalb manchmal ungünstig, weil man ja die Speichergröße ausrechnen muss. Klar ist das kein Problem, aber man kann sich da ja ruck zuck mal vertun, deswegen finde ich auch die stl Algos und so in der Regel besser.
Aber bevor man jetzt eine Schliefe über 3 Zeilen schreibt, da ist mem* doch besser. Aber halt nur, wenn es Byteweise sein soll.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige