TstringList je IMHO vyrazne optimalnejsi z hlediska pameti a dalsich, je to specialni vec. genericky je obecnejsi.
Já nemám dostatek relevantních informací, ale myslíš, že to bude výrazně nebo alespoň znatelně v paměti lepší?
TStringList je na tom nesporně lépe, co se týče funkcí.
TList je ale jen nějaké pole stringů. TStringList je taky pole stringů, resp. ukazatel na pole, kde je navíc v paměti ukazatel na objekt.
Strukturou je to 100% stejné. TStringList má jen doprogramovanou funkčnost navíc. Jak jsou vnitřně udělána generika nevím.
Představ si, že máš dvě deklarace TList<string> na ruznych místech. Linker nedokáže uplně spojit jejich implementace (tj. např. metody Add a spol.) a chápe je jako odlišné typy, což i v podstatě jsou. Pokud se nepletu, tak v posledních verzích se na tom hodně zapracovalo, a i když se jedná pořád o odlišné typy, jejich implementace jsou v podstatě inline a volají společné "helper" funkce, které jsou linkovány už jen jednou (na rozdíl od minulosti, kdy se kód hodně opakoval). Pokud si pamatuji tak, platí např. i pro TArray atd. Takže velikost kódu významně poklesla (to je důvod proč v jedné z posledních verzí klesla velikost stejné aplikace velkem výrazně proti předchozí verzi).
IMHO se tomu dá ještě pomoci deklarací type TMujTypList = TList<MujTyp>, čím si zacháváme výhody generik a snížíme velikost kódu, protože linker to bude chápat jako jeden typ. Ale to ber bez záruky. Generika jsou částečně magie linkeru (stejně jako anonymní metody, tam je to přímo Avada Kedavra).
Pokud máš dvakrát TStringList, je to pořád TStringList. Jenže to je jen pro stringy.