C# 获取正确大小的数据(结构)时遇到问题
我正在测试C# 获取正确大小的数据(结构)时遇到问题,c#,performance,unsafe,value-type,C#,Performance,Unsafe,Value Type,我正在测试structvsclassvsTuple 在托管vs不安全并行和正常执行中 因此,要获得每种情况下处理的数据的大小,我在获得正确大小的valueType public struct Schar { public int V; public char[] ChrArr; } Schar tSchr = new Schar()//set value: V=1,ChrArr= 'a','b','c','d','e'... 现在,当我设置tSchr时,无论chrar的大小,我
struct
vsclass
vsTuple
在托管vs不安全
并行和正常执行中
因此,要获得每种情况下处理的数据的大小,我在获得正确大小的valueType
public struct Schar
{
public int V;
public char[] ChrArr;
}
Schar tSchr = new Schar()//set value: V=1,ChrArr= 'a','b','c','d','e'...
现在,当我设置tSchr
时,无论chrar的大小,我都会得到相同的结果
(8@I386
和16@AMD64
)
我已经尝试了sizeOf
/marshall
unsafe int GetDataSizeOf(System.ValueType TestedSchar)//could be any Structure not specifically 'Schar'
{
int rt=Marshal.SizeOf(TestedSchar);
//return sizeof(TestedSchar);
}
我可以在GetDataSizeOf
中添加Length
参数并进行乘法,但只有通过Schar
类型的struct
而不是任何其他参数,才可以。
如果另一个结构将有2个char[]
字段或其他形式的其他变体,则无法计算长度,因此
如何在非托管环境中实现大小的正确方法
更新
下一个结构是blittbale
当我通过GetDataSizeOf()
如果我用上面的结构做另一个呢,如下所示
public unsafe struct chars32
{
public chars32A Fld1;
public chars32A Fld2;
}
我是否也必须检查结构中的每个字段的大小?@Rakhitha不确定为什么删除了答案,这是正确的。@AsadSaeeduddin我没有看到它。。(:解释是:所有数组都是引用类型,所以它们是在堆上分配的,而不是作为结构的一部分。结构只为指向数组的指针分配空间,不管数组实际有多大,指针的大小都是相同的。@AsadSaeeduddin意味着我应该检查对象的大小,而不是valueType
?我不认为你这样做正如我所说。数组的内存是单独分配的,在某个堆上的某个地方。它不是为Schar
类型分配的内存的一部分,事实上,这样分配是不可能的,因为值类型的所有实例都占用一定量的内存,而char[]
可以是大的也可以是小的。你看到的行为和预期的一样。@Rakhitha不确定你为什么删除了你的答案,这是正确的。@AsadSaeeduddin我没有看到它。。(:解释是:所有数组都是引用类型,所以它们是在堆上分配的,而不是作为结构的一部分。结构只为指向数组的指针分配空间,不管数组实际有多大,指针的大小都是相同的。@AsadSaeeduddin意味着我应该检查对象的大小,而不是valueType
?我不认为你这样做正如我所说。数组的内存是单独分配的,在某个堆上的某个地方。它不是为Schar
类型分配的内存的一部分,事实上,这样分配是不可能的,因为值类型的所有实例都占用一定量的内存,而char[]
可以是任意大小。您看到的行为与预期一致。
public unsafe struct chars32
{
public chars32A Fld1;
public chars32A Fld2;
}