gpt4 book ai didi

c# - 有没有更快/更干净的方法将结构复制到 C# 中的数组?

转载 作者:太空狗 更新时间:2023-10-29 23:17:48 25 4
gpt4 key购买 nike

我有一个 float4x4 结构,它只包含 16 个 float :

struct float4x4
{
public float M11; public float M12; public float M13; public float M14;
public float M21; public float M22; public float M23; public float M24;
public float M31; public float M32; public float M33; public float M34;
public float M41; public float M42; public float M43; public float M44;
}

我想将这些结构的数组复制到一个大的 float 数组中。据我所知,这是一 block 内存的 1:1 副本

我所知道的是相当丑陋,而且不是那么快:

        int n = 0;
for (int i = 0; i < Length; i++)
{
array[n++] = value[i].M11;
array[n++] = value[i].M12;
array[n++] = value[i].M13;
array[n++] = value[i].M14;

array[n++] = value[i].M21;
array[n++] = value[i].M22;
array[n++] = value[i].M23;
array[n++] = value[i].M24;

array[n++] = value[i].M31;
array[n++] = value[i].M32;
array[n++] = value[i].M33;
array[n++] = value[i].M34;

array[n++] = value[i].M41;
array[n++] = value[i].M42;
array[n++] = value[i].M43;
array[n++] = value[i].M44;
}

如果我使用的是较低级别的语言,我会简单地使用 memcpy,在 C# 中我可以使用什么作为等价物?

最佳答案

你不能使用内存副本,因为你不能盲目地假设成员是如何存储在结构中的。 JIT 编译器可以决定在它们之间填充几个字节来存储它们,如果这样可以使其更快的话。

无论如何,您的结构对于建议的结构大小来说太大了,因此您应该将其设为类。此外,结构不应该是可变的,这也代表了一个类。

如果将属性存储在内部数组中,则可以使用它来复制值:

class float4x4 {

public float[] Values { get; private set; }

public float4x4() {
Values = new float[16];
}

public float M11 { get { return Values[0]; } set { Values[0] = value; } }
public float M12 { get { return Values[0]; } set { Values[0] = value; } }
...
public float M43 { get { return Values[14]; } set { Values[14] = value; } }
public float M44 { get { return Values[15]; } set { Values[15] = value; } }

}

现在您可以从对象中获取 Values 数组并使用 Array.CopyTo 方法复制到该数组:

int n = 0;
foreach (float4x4 v in values) {
v.Values.CopyTo(array, n);
n += 16;
}

关于c# - 有没有更快/更干净的方法将结构复制到 C# 中的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7454027/

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