Gibt es einen Algorithmus in der STL, der.....
-
paddy@work schrieb:
wenn ich nicht mit reserve arbeiten würde, müsste doch für jedes byte immer wieder neu speicher reserviert werden (im push_back).
Das möchte ich verhindern, da es doch langsamer ist, 65536 mal 1 Byte speicher zu holen, als einmal 64 KB, oder sehe ich das falsch?
Grundsätzlich siehst Du das nicht falsch, aber "so doof" sich immer nur ein Byte zu holen wird kein Vector dieser Welt sein

-
paddy@work schrieb:
Das möchte ich verhindern, da es doch langsamer ist, 65536 mal 1 Byte speicher zu holen, als einmal 64 KB, oder sehe ich das falsch?
ganz dicker hund das.
push_back verdopplet immer den speicher, wenn der alte alle ist. das führt zu amortisierten kopierkosten von O(1) pro push. (wegen 1+2+4+8+16+32+...+216==217-1, also bei startgröße 1 und 16 mio einfügungen gäbe es nur 32 mio kopierungen und vor allem nur 32 aufrufe von new/delete).
mit jedem fixen reserve haste O(n).
wenn du doch reserve nimmst, um copy nehmen zu können (würde ich vermutlich tun), dann geh auch so vor (würde ich auch tun).
oder wenigstensif( (capacity - size) < 4096) //diese bedingung ist unsauber { _Buffer.reserve(capacity+max(65536,capacity/8)); //nicht mein geschmack }
-
std::vector<unsigned char> data(4096); recv(s, &data[0], data.size(), 0);
-
also entweder reserve und copy, oder nur push_back schleife?
und wie kommst du auf die /8 ???
-
paddy@work schrieb:
also entweder reserve und copy, oder nur push_back schleife?
oder insert, was innendrin ne pushback-schleife hat.
und wie kommst du auf die /8 ???
willkür. /1 geht auch. /8 könnte man für gut halten, wenn man angst hätte, der speicher ginge aus. macht aber eher nur lahm.
-
Danke Volkard,
schönes Wochenende noch,
Gruß Patrick