Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取正确大小的数据(结构)时遇到问题_C#_Performance_Unsafe_Value Type - Fatal编程技术网

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
vs
class
vs
Tuple
在托管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;
}