Om dygnet hade 48 timmar så kanske och skulle jag göra den så hade jag inte gjort den från 0, har rätt mycket generell kod precis som stl för att pussla ihop saker.
Jag gillar inte boost och den främsta orsaken är att det är rejäla nördar som kodat det mesta där. Vad jag vet så är det endast ett fåtal som underhåller och kan underhålla koden. De är självklart fantastiskt duktiga men förstår inte att det mesta är i deras huvud.
Ett annat problem denna typ av kod som nära nog har samma krav som STL får. Koden måste fungera överallt. Det innebär att boost måste hantera sådant som kanske bara en av tiotusen någonsin kommer ha behov av.
För att ta ett exempel.
I stl finns en väldigt användbar klass som heter std::string_view. Den är så bra för att den underlättar utan att att kosta speciellt mycket i prestanda. std::string_view har endast en pekare till en buffer (char*) och dess längd. Så vad är problemet med det?
Längden på strängen är på en 64 bitars dator 8 byte, pekaren är också 8 byte. sizeof( std::string_view ) = 16
Kanon - 16 byte är en multipel på 4, det går in 4 stycken std::string_view på en cache line ( intel processorer ).
Sannolikheten att det behövs 8 byte för att hålla längden i en sträng finns inte idag, så mycket minne har inte datorer, 5 byte hade troligen klarat allt. Men klarar i princip alla scenarior med 4 byte, 4 byte skulle alltså i de allra flesta fall vara tillräckligt för sköta längden i std::string_view
När det gäller just std::string:view är detta inte ett problem, block om 16 byte är ofta att föredra framför 12 byte, det går fortfarande bara in 4 std::string_view på en cache line om den varit 12 byte.
I fallet std::string_view är det inget problem att de slarvar lite med minnesutrymmet.
Problemet uppstår när man gör klasser som behöver mer information än vad std::string_view behöver, en variabel till eller kanske mer ändå.
boost har exempelvis Boost.JSON. Om de inte ändrat senaste åren så varje element i deras JSON objekt är 48 byte. Jämför man med andra generella bibliotek skrivna för att hantera JSON så är deras json objekt nästan alltid 32 byte.
Hur kommer det sig att just boost slarvade så vilket också gör att man inte kan få in 2 json objekt på en cache line.
Förklaringen är just att boost måste anpassa sig för att klara ALLA situationer. Boost kan inte trixa lika mycket som andra bibliotek kan, samma med STL. STL är absolut supersnabbt men det finns gränser i vad de kan göra eftersom de måste klara av att hantera ALLA möjliga situationer.
Så varför då använda boost?
Tror inte det är så många idag som behöver det, de som plockar in boost gör det kanske för någon enstaka. Det finns självklart de som använder en hel del i boost men behovet är inte alls samma som för +5 år sedan. STL har också ätit upp en del av boost.
Största nackdelen med boost som de inte kan göra så mycket åt idag är att det är stort, att dela upp det i delar är ofta komplicerat. Dessutom så är koden till och med svårare att debugga än stl.
Kod för att skriva en webserver eller nätverk generellt är en styrka, Parser (tidigare spirit) tror jag också är mycket användbart för de som behöver den typen av logik. Har man mycket avancerade regex hantering kan det också vara värt. Annars finns det oftast enklare lösningar att välja på annat håll eller skriva koden själv.
Hade jag valt lösning för json trots att man eventuellt redan använder boost hade jag inte valt Boost.JSON, hade plockat in något annat.