【问题标题】:Size of generic type泛型类型的大小
【发布时间】:2009-04-29 11:54:56
【问题描述】:

有什么方法可以确定类似的大小(以字节为单位)

TItem <T> = record
  Data : T;
end;

我可以写一些类似的东西

function TItem <T>.GetByteSize : Integer;
begin
if (T = String) then
  Result := GetStringByteSize (Data as String)
else
  Result := SizeOf (Data);
end;

或者也许在专业化的帮助下?

function TItem <String>.GetByteSize : Integer;
begin
  Result := GetStringByteSize (Data)
end;

function TItem <T>.GetByteSize : Integer;
begin
  Result := SizeOf (Data);
end;

谢谢!

【问题讨论】:

    标签: delphi generics delphi-2009 specialization


    【解决方案1】:

    取实例化类型的大小有什么问题吗?

    SizeOf(TItem<string>)
    

    或者你可以像这样定义 GetByteSize:

    function TItem <T>.GetByteSize : Integer;
    begin
      Result := SizeOf(TItem<T>);
    end;
    

    【讨论】:

    • 我希望 GetByteSize 返回对象的字节大小,包括数据成员的大小,即对于 T=String,我想要类似“SizeOf (Data) + Length (Data) * SizeOf(字符) + 4"
    • 这是一个非常不同的问题,并不特定于泛型。尝试计算您正在谈论的递归大小的问题是循环(用于对象引用)和共享。例如,对于 T=String,您 (a) 应该添加 12,而不是 4 (codePage:2, elemSize:2, refCnt:4, length:4),并且 (b) 如果字符串是共享的 (refCnt > 1)?
    • 我知道这通常是一个非常困难的问题(我之前发布过一个关于此的问题),但我只希望在这种特殊情况下使用这个,其中 String 是唯一需要额外处理的类型(对于其他所有类型,我将只使用 SizeOf)。我决定将共享视为一种优化并计算“最坏情况下的大小”。
    【解决方案2】:

    不,据我所知,您不能根据类型进行专业化

    【讨论】:

      猜你喜欢
      • 2015-07-31
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      相关资源
      最近更新 更多