Veröffentlicht 26. September 200816 j Hallo zusammen, wie findet ihr diesen Code: LPSTR text = new[zahl]; memset(text, ’ ’, zahl); text[zahl] = 0; tue was… delete text; [/PHP] mir geht es um den delete ist es so ok oder kriege ich eben memory allocation problem Gruß
26. September 200816 j Nur dieser ausschnitt ist ok so, zumindest so lange wie ein Element deines Datentyps ein Byte groß ist Bzw nein das letzte Element in dienem Array ist zahl-1, nicht zahl
26. September 200816 j Der Zugriff auf text[zahl] ist nicht erlaubt, der letzte gültige Index ist zahl-1.Wenn du new[] benutzt, musst du auch delete[] benutzen.Nicht Exception-sicher. Ich würde das eher so machen: std::vector<char> v(zahl, ' '); v.back() = '\0'; tue was…[/code]
26. September 200816 j Autor Der Zugriff auf text[zahl] ist nicht erlaubt Hm.. stimmt komisch das es so funktioniert?? Wenn du new[] benutzt, musst du auch delete[] benutzen. kannst Du es bitte ein wenig begründen, warum?
26. September 200816 j Hm.. stimmt komisch das es so funktioniert??Ja, das ist das Schöne an undefiniertem Verhalten, wie es der Standard nennt. Das muss nicht abstürzen. Es kann alles passieren, auch dass es einfach tut, was es soll. kannst Du es bitte ein wenig begründen, warum?Da gibt es nicht viel zu begründen. Der Standard sagt, wenn du new[] benutzt, musst du delete[] zum Freigeben benutzen, alles andere erzeugt wiederum undefiniertes Verhalten. Es gibt Compiler, die in solchen Fällen trotzdem funktionierenden Code erzeugen, aber darauf solltest du dich nicht verlassen.
26. September 200816 j Autor LPSTR text = new[zahl+1]; memset(text, ’ ’, zahl); text[zahl] = 0; tue was… --> braucht text delete[] text; [/PHP] ok ist so besser?? @Klotzkopp was ist performanta deine lösung oder meine
26. September 200816 j ok ist so besser??Zumindest ist kein undefiniertes Verhalten mehr drin was ist performanta deine lösung oder meine Das kommt ein wenig auf den Compiler an. Möglicherweise ist die Lösung mit std::vector ein wenig langsamer, möglicherweise sind sie gleich schnell. Der Unterschied sollte aber so klein sein, dass du dir darüber aber nur Gedanken machen solltest, wenn du sicher bist, dass genau diese Stelle einen Performance-Flaschenhals darstellt. Wenn du Bedenken wegen der Performance hast, könntest du auch std::tr1::array benutzen (oder boost::array, wenn dein Compiler den TR1 nicht unterstützt).
29. September 200816 j Autor dass du dir darüber aber nur Gedanken machen solltest, wenn du sicher bist, dass genau diese Stelle einen Performance-Flaschenhals darstellt. da hätte ich was: void xyz::funktion(CString& strText) { int nLength = strText.GetLength(); LPSTR pText = strText.GetBuffer(); for (int i = 0; i < nLength; i++) pText[i] = m_aZeichen[(unsigned char)pText[i]]; strText.ReleaseBuffer(); } [/PHP] die Funktion wird ca. 8000 mal aufgerufen kann man da was machen?
29. September 200816 j die Funktion wird ca. 8000 mal aufgerufen kann man da was machen?Je nach Zielarchitektur kann es vorteilhaft sein, wenn du die Schleife so umstellst, dass sie rückwärts bis 0 zählt. Du könntest auch versuchen, die Schleife zu "entrollen", beispielsweise mit Duff's Device. An der Transformation selbst lässt sich IMHO nichts machen. Du könntest die Lookup-Tabelle auf 16 Bit vergrößen, so dass du zwei Zeichen gleichzeitig transformieren kannst. Aber das könnte auch die Cache-Lokalität verschlechtern.
30. September 200816 j Hallo, Je nach Zielarchitektur kann es vorteilhaft sein, wenn du die Schleife so umstellst, dass sie rückwärts bis 0 zählt. Naja, das sollte heute eigentlich nicht mehr relevant sein [1]. Ein brauchbarer Compiler wählt automatisch die beste Variante und dreht im Zweifelsfall die Schleife selbst um. Da bringt es wahrscheinlich mehr, die Zeichen in m_aZeichen nach Häufigkeiten vorzusortieren Nic [1] Bzw. wenn die Routine tatsächlich so zeitkritisch ist, dass man jeden Zyklus einzeln zählen und auf eine Zielarchitektur optimieren muss, dann lieber gleich in Assembler programmieren.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.