Unterschiede zu C++ für Umsteiger von Java



  • ManOMan schrieb:

    Ahh, mit zur Laufzeit meinst du die interne darstellung. Was ich eigentlich mit "einen string für alles" mein, ist das man in C++ ständig andere hat. Jedes Framework hat nen anderen CString, std::(w)string, BSTR....

    Ja, aber nochmal: dafür kann ISO-C++ nichts. wstring gibts seit 1998 bei der ISO. wxString, QString, CString usw. sind weit vor 1998 entstanden. Wenn die Framework-Urheber nicht auf wstring umspringen, ist das nicht ein Problem von C++.

    Microsofts gesamte API arbeitet heute anstandslos mit wstring bzw. wchar_t* zusammen, ohne das man als C++-Programmierer seine wstrings konvertieren muß. 👍 Die GDI+ z.B. arbeitet ausschliesslich nur noch mit diesem String-Typ zusammen. Hier hat MS ausnahmsweise auf ISO-C++-kompatibilität umgestellt. Obwohl viele MS immer wieder keine Standards vorwerfen. Aber da haben vielen OpenSource-Projekte was nachzuholen.

    Wenn andere Libs nicht mit wstring arbeiten, ist das keine C++-Schuld. Man muß differenzieren. MS hat den Umstieg heute durchgezogen und ist aus dem Schneider.

    ManOMan schrieb:

    Und mit getBytes in die andere richtung.

    Stimmt, hab vergessen das man bei den Bytes den Typ angeben kann. Sorry.

    Aber die Laufzeit ist davon nicht betroffen. Wenn ich in C++ einen wstring z.B. als UTF-8 rausschreiben will, mache ich sowas:

    #include <fstream>
    #include <locale>
    #include "Dinkum/codecvt/wbuffer"
    #include "Dinkum/codecvt/utf8"
    .....
        {   // write Hello as one line to a file
        std::ofstream bytestream("myfile.txt"); // open file as byte stream
    
        Dinkum::codecvt::wbuffer_convert< Dinkum::codecvt::codecvt_utf8<wchar_t> >
                mybuf(bytestream.rdbuf());  // construct wide stream buffer object
    
        std::wostream mystr(&mybuf); // construct wide ostream object
        mystr << L"Hello" << std::endl;
        }
    

    Das Defizit bei C++ ist, das die utf8-Facate im ISO nicht vorgeschrieben ist. Aber man kann beliebige Facets einbinden, in dem man eine andere codecvt-Implementierung nimmt, was analog zu den Java-Byte-String-Konvertierungen ist.

    Habe ein Bild dazu gezeichnet:
    http://www.kharchi.de/codecvt.png



  • Andromeda schrieb:

    Dir ist aber schon klar, daß du damit sehr viel Speicher verschwendest?

    Das ist doch für 99% der Anwendungen vollkommen irrelevant! Dann verbraucht man eben (maximal) doppelt soviel Speicher, na und? Das ist ein konstanter Faktor, das ist vollkommen nebensächlich? Wann braucht man denn mal so große Strings, dass das eine Rolle spielt?

    (Ich weiß wann: Ich selbst verwende std::string in der Bioinformatik um chemische Sequenzen darzustellen, hier wäre std::wstring wirklich fehl am Platze. Aber für alles verwende ich std::wstring).


Anmelden zum Antworten