gpt4 book ai didi

c# - 整数数组或结构数组 - 哪个更好?

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

在我的应用程序中,我将Bitmap 数据存储在一个二维整数数组(int[,]) 中。要访问 R、G 和 B 值,我使用如下方法:

// read:
int i = _data[x, y];
byte B = (byte)(i >> 0);
byte G = (byte)(i >> 8);
byte R = (byte)(i >> 16);
// write:
_data[x, y] = BitConverter.ToInt32(new byte[] { B, G, R, 0 }, 0);

我使用整数数组而不是实际的 System.Drawing.Bitmap,因为我的应用程序在 Windows Mobile 设备上运行,其中可用于创建位图的内存非常有限。

不过,我想知道声明这样的结构是否更有意义:

public struct RGB
{
public byte R;
public byte G;
public byte B;
}

... 然后使用 RGB 数组而不是 int 数组。这样我就可以轻松读取和写入单独的 R、G 和 B 值,而无需进行位移和 BitConverter-ing。我依稀记得以前关于 byte 变量在 32 位系统上 block 对齐的事情,所以 byte 实际上占用 4 个字节的内存而不是仅仅 1 个(但也许这只是 Visual Basic 的事情)。

使用结构数组(如上面的 RGB 示例)是否会比使用整数数组更快,它会使用 3/4 的内存还是 3 倍的内存?

最佳答案

如果您在速度上,那么技术上我希望int[] 版本更快,因为有一个特定的用于从数组中获取 int 的 IL 指令(参见 OpCodes.Ldelem_I4)。要执行自定义结构,它必须获取地址 (OpCodes.Ldelema),然后复制结构 (OpCodes.Ldobj) - 为这两个步骤处理类型元数据.

简而言之 - int 方法应该有更好的优化。但这是微优化 - 一般更喜欢使您的代码更具可读性的版本。您可能考虑的是使用从 int 到您的结构的自定义静态隐式转换运算符编写结构 - 然后您可以拥有 int[]并且仍然这样做:

MyColor col = intArr[12];

(当然,它会在中间进行静态调用)

您也可以考虑使用联合,这样您就不需要做很多移位:

重要 我还没有仔细检查过字节顺序;只需更改 R/G/B 的偏移量即可更改它。

class Program
{
static void Main()
{
int[] i = { -1 };
RGB rgb = i[0];
}
}
[StructLayout( LayoutKind.Explicit)]
public struct RGB
{
public RGB(int value) {
this.R = this.G = this.B = 0; this.Value = value;
}
[FieldOffset(0)]
public int Value;
[FieldOffset(2)]
public byte R;
[FieldOffset(1)]
public byte G;
[FieldOffset(0)]
public byte B;

public static implicit operator RGB(int value) {
return new RGB(value);
}
public static implicit operator int(RGB value) {
return value.Value;
}
}

关于c# - 整数数组或结构数组 - 哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2441466/

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