bigpoint Geschrieben 26. September 2008 Geschrieben 26. September 2008 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ß Zitieren
Guybrush Threepwood Geschrieben 26. September 2008 Geschrieben 26. September 2008 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 Zitieren
Klotzkopp Geschrieben 26. September 2008 Geschrieben 26. September 2008 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] Zitieren
bigpoint Geschrieben 26. September 2008 Autor Geschrieben 26. September 2008 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? Zitieren
Klotzkopp Geschrieben 26. September 2008 Geschrieben 26. September 2008 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. Zitieren
bigpoint Geschrieben 26. September 2008 Autor Geschrieben 26. September 2008 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 Zitieren
Klotzkopp Geschrieben 26. September 2008 Geschrieben 26. September 2008 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). Zitieren
bigpoint Geschrieben 29. September 2008 Autor Geschrieben 29. September 2008 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? Zitieren
Klotzkopp Geschrieben 29. September 2008 Geschrieben 29. September 2008 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. Zitieren
nic_power Geschrieben 30. September 2008 Geschrieben 30. September 2008 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. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.