gpt4 book ai didi

c# - 具有通用类型字段的结构的大小

转载 作者:太空狗 更新时间:2023-10-30 00:07:50 25 4
gpt4 key购买 nike

我想估计包含泛型类型参数的结构数组的大小,在本例中为字典条目结构。为此,我需要结构的大小。

struct Entry
{
int hash;
int next;
TKey key;
TValue value;
}

如何获取此结构的字节大小?

编辑

似乎使用了 Marshal.SizeOf是有问题的。传递结构的类型 将引发异常,指出参数不能是泛型类型定义。

如果我改为调用采用实例的重载,例如Marshal.SizeOf(default(Entry))如果两个 泛型类型参数都是值类型,它将起作用。如果通用参数是例如<int, object>然后抛出这个异常

Dictionary`2+Entry[System.Int32,System.Object]' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed.

最佳答案

听起来像 IL sizeof说明可能是你需要的。 sizeof 指令被 C# 使用 sizeof运算符在幕后,但由于某些原因,IL 版本的限制较少。

ECMA CLI specification (第 III 部分,第 4.25 节)对 sizeof 指令有这样的描述:

Returns the size, in bytes, of a type. typeTok can be a generic parameter, a reference type or a value type.

For a reference type, the size returned is the size of a reference value of the corresponding type, not the size of the data stored in objects referred to by a reference value.

[Rationale: The definition of a value type can change between the time the CIL is generated and the time that it is loaded for execution. Thus, the size of the type is not always known when the CIL is generated. The sizeof instruction allows CIL code to determine the size at runtime without the need to call into the Framework class library. The computation can occur entirely at runtime or at CIL-to-native-code compilation time. sizeof returns the total size that would be occupied by each element in an array of this type – including any padding the implementation chooses to add. Specifically, array elements lie sizeof bytes apart. end rationale]

您应该能够通过一些简单的运行时代码生成来获取 sizeof 指令:

Console.WriteLine("Entry is " + TypeHelper.SizeOf(typeof(Entry)) + " bytes.");

// ...

public static class TypeHelper
{
public static int SizeOf<T>(T? obj) where T : struct
{
if (obj == null) throw new ArgumentNullException("obj");
return SizeOf(typeof(T?));
}

public static int SizeOf<T>(T obj)
{
if (obj == null) throw new ArgumentNullException("obj");
return SizeOf(obj.GetType());
}

public static int SizeOf(Type t)
{
if (t == null) throw new ArgumentNullException("t");

return _cache.GetOrAdd(t, t2 =>
{
var dm = new DynamicMethod("$", typeof(int), Type.EmptyTypes);
ILGenerator il = dm.GetILGenerator();
il.Emit(OpCodes.Sizeof, t2);
il.Emit(OpCodes.Ret);

var func = (Func<int>)dm.CreateDelegate(typeof(Func<int>));
return func();
});
}

private static readonly ConcurrentDictionary<Type, int>
_cache = new ConcurrentDictionary<Type, int>();
}

关于c# - 具有通用类型字段的结构的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16519200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com