Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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ß

Geschrieben

  • 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]

Geschrieben
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.
Geschrieben


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 :)

Geschrieben
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).

Geschrieben
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?

Geschrieben
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.

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...