Std::string vs char* array

Std::string vs char* array
2019-03-02T12:16:38+01:00
2019-03-02T16:50:36+01:00
2022-10-15T21:41:20+02:00
raketamernok
Sziasztok!
A követekző a problémám:
hogy ha jól tudom a a C++-os std::string szövegtároló forma és a karakter tömbökkel reprezentált szövegek átkonvertálhatók egymásba az alábbi módon:

char *array="text"; std::string s(array);
másik irányba:

std::string s("text-2"); char *array=&(s[0]);
Engem az érdekelne, hogy ez mennyire hatékony konverzió? Mert ha jól tudom más memóriaterületekre is foglalódik a két különböző típussal létrehozott szövegek, és az std::string "gondoskodik magáról" a saját memória területéről, ahová foglalódik, és arról, hogy ne történhessen overflow attack, amíg ez karaktertömböknél simán előfordulhat. Van valami hatékonyabb konverzió, vagy más megoldás?
Mutasd a teljes hozzászólást!
A "std::string s(array)" másolatot készít az átadott tömbről, ilyen szempontból nem "hatékony", de ez a biztonság ára (a tömbbel utána bármit kezdhetsz, a string tartalmát nem érinti).
A másik irányban közvetlenül egy pointert kapsz, az nem nagyon tudna gyorsabb lenni. Régi C++ verzióknál nincs rá garancia, hogy lesz egy 0 a string végén, most már lesz. Lásd a string::data - C++ Reference  C++98-as és C++11-es leírását. Az s.data() meg az s.c_str() azért jobban néznek ki, mint az &(s[0]).
Amúgy meg ne konvertálj sokat, C++-ban alapból használj std::string-et, és csak akkor pointerezzél, amikor muszáj - mondjuk valami C-s csoda meghívásakor.

Mert ha jól tudom más memóriaterületekre is foglalódik a két különböző típussal létrehozott szövegek

Ezt valószínűleg nem jól tudod. Ha foglalódnak, akkor mindketten a heap-en teszik. Az más kérdés, hogy a szövegkonstansoknak (amivel inicializálod akár az egyiket, akár a másikat) van egy fix memóriaterületük.
Mutasd a teljes hozzászólást!

  • Próbálj meg minél kevesebbet konvertálni, de ilyet ne csinálj, még ha egyes esetekben látszólag működik is:

    char *array=&(s[0]);
    string::c_str - C++ Reference
    Mutasd a teljes hozzászólást!
  • Esetleg tudsz olyan esetet ahol nem működik?
    Mutasd a teljes hozzászólást!
  • c++98, vagy korábbi standard egyáltalán nem garantálja, hogy működjön..
    Mutasd a teljes hozzászólást!
  • A "std::string s(array)" másolatot készít az átadott tömbről, ilyen szempontból nem "hatékony", de ez a biztonság ára (a tömbbel utána bármit kezdhetsz, a string tartalmát nem érinti).
    A másik irányban közvetlenül egy pointert kapsz, az nem nagyon tudna gyorsabb lenni. Régi C++ verzióknál nincs rá garancia, hogy lesz egy 0 a string végén, most már lesz. Lásd a string::data - C++ Reference  C++98-as és C++11-es leírását. Az s.data() meg az s.c_str() azért jobban néznek ki, mint az &(s[0]).
    Amúgy meg ne konvertálj sokat, C++-ban alapból használj std::string-et, és csak akkor pointerezzél, amikor muszáj - mondjuk valami C-s csoda meghívásakor.

    Mert ha jól tudom más memóriaterületekre is foglalódik a két különböző típussal létrehozott szövegek

    Ezt valószínűleg nem jól tudod. Ha foglalódnak, akkor mindketten a heap-en teszik. Az más kérdés, hogy a szövegkonstansoknak (amivel inicializálod akár az egyiket, akár a másikat) van egy fix memóriaterületük.
    Mutasd a teljes hozzászólást!
  • Ha üres a string nem működik, de akkor meg az s[0]-val túlindexelte a tömböt. Ha nem üres akkor pedig ugyan úgy működik, mert null terminated lesz. Van amúgy aki még c++98 szabványt használja?
    Mutasd a teljes hozzászólást!
  • 4-5 éve még multinál ha jól emlékszem 3-as GCC-t használtak.. Úgyhogy szerintem előfordul még, ahol nem igazán törődnek az ilyesmivel valamiért..
    Máshol is volt ahol kódmodernizálást akartak csinálni, jelenleg is futó termékkel kapcsolatban és ilyen 10+ éves könyvtárak, fordító, környezet volt használva. (Arról nem is beszélve, hogy C89-es standard szerinti kód van eladva/előadva C++-ként..)

    Szóval nekem nem esik nehezemre elképzelni, hogy elég sok helyen még a 98-as standard 'fut'..
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd