Na binární data narážím když je potřebuju odněkud převzít nebo někam předat. Pak mi způsob určí ta knihovna či funkce.
Pokud musím navrhnout datový typ, pak tvořím co se mi zdá vhodné ke konkrétnímu účelu. Když to není kritická část kódu tak hledám přehlednost a ať nemusím moc přemýšlet a ať to pak už nemusím nijak konvertovat.
Když je kód v něčem kritický, ptám se v čem: paměťová náročnost, CPU náročnost, častá alokace a uvolnění, častá změna velikosti, mnoho malých kousků... a ptám se které vlastnosti budu znát předem: min. a max. velikost, pevnou velikost nebo jen několik druhů bloků, velikost dat např. vždy jako násobek 256bytů, že každý blok budu zvětšovat o 3byty nebo naopak že se velikost měnit nebude, jestli se bude plnit jednorázově pole ze souboru nebo naopak lepit a přehazovat kousky...
Pro data v paměti není žádný způsob ten jediný obecně správný a univerzální a nejoptimálnější. Příliš záleží na konkrétním použití a v C++ záleží hlavně na tobě, jak to chceš.
Obecně třeba unsigned char []
nebo uint16_t []
nebo sstream, s tím se pracuje jako se souborem
pro Cčkaře malloc()
Když bude každý řetězec měnit velikost, pak vector<unsigned char>
Pro řádky nebo odstavce malého textového editoru (max. desítky tisíc řádků) bych dal třeba
typedef vector<uint32_t> line_t;
nebo
typedef vector<uint8_t> line_t;
typedef vector<line_t> text_t;
Pro RGB data třeba struct {unsigned char R, G, B; }
Ten nápad s délkou v utf-8 se mi líbí...
Pro mnoho krátkých kousků bych možná vytvořil něco úplně Pascalovského, protože vector<> má myslím režii tři pointery a jednu alokaci paměti, tedy jeden byte zabere asitak 48bytů? a má význam hlavně tam kde se bude velikost často měnit. Kdesi jsem řešil že délka datových bloků byla min. 6 a max. 259 a velikost se tedy dala uložit do jediného bytu...
Pro unicode text bych počítal s utf-8, znak 0x00 v textu nepotkávám a snad tam ani nemá co dělat, nevím. Pak by string nebo i char * klidně stačil. Naopak pozor na uložení textu do 16bitového typu, ten teoreticky nepojme všechny unicode znaky a bude vytvářet byty 0x00 i tam kde znak NUL (tedy 0x0000) není...
Pokud by výsledek měl být v 16bitových znacích, pak bych používal
jako základ uint16_t .
Pokud má být výsledek podle definice wchar_t (zatím neznám) tak ho použiju.
Pokud by výsledek měl být unicode text, třeba v utf-8 nebo v utf-16 tak bych pro zpracování použil raději unsigned int nebo uint32_t nebo tak něco a konvertoval to.