Est-il possible de déterminer la taille en octets de quelque chose commeTaille du type générique
TItem <T> = record
Data : T;
end;
Puis-je écrire quelque chose comme
function TItem <T>.GetByteSize : Integer;
begin
if (T = String) then
Result := GetStringByteSize (Data as String)
else
Result := SizeOf (Data);
end;
ou peut-être avec l'aide de spécialisation?
function TItem <String>.GetByteSize : Integer;
begin
Result := GetStringByteSize (Data)
end;
function TItem <T>.GetByteSize : Integer;
begin
Result := SizeOf (Data);
end;
Merci!
Je veux GetByteSize pour retourner la taille en octets de l'objet, y compris la taille des membres de données, à savoir T = String, je veux quelque chose comme "SizeOf (Data) + Length (Data) * SizeOf (Char) + 4" – jpfollenius
C'est une question très différente, et n'est pas spécifique aux génériques. Les problèmes pour essayer de calculer le type de taille récursive dont vous parlez sont les cycles (pour les références d'objet) et le partage. Pour T = String, par exemple, vous (a) devriez ajouter 12, pas 4 (codePage: 2, elemSize: 2, refCnt: 4, longueur: 4), et (b) que faire si la chaîne est partagée (refCnt> 1)? –
Je sais que c'est en général un problème très difficile (j'ai posté une question à ce sujet avant), mais je veux seulement ce scénario spécial, où String est le seul type qui nécessite un traitement supplémentaire (pour tous les autres types utilisez SizeOf). J'ai décidé de voir le partage comme une optimisation et de calculer une "taille de casse". – jpfollenius