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

标签 c# .net memory struct rgb

在我的应用程序中,我将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/

相关文章:

c# - 线程结束后执行一条语句

c# - Expression<Func<T,TResult>>.Compile() 的反转?

c# - 如何将 object[] 传递给 Activator.CreateInstance(type, params object[])

c++ - AVL 树插入 - 访问冲突读取位置(无法读取内存)

c - 如果 Realloc() 失败,调用者是否会丢失前一个 malloc() 调用中的数据?

c# - 无需先加载即可读取 tiff 文件的尺寸和分辨率

c# - 无法反序列化当前的 JSON 数组(例如 [1,2,3])。 C#,无法找出错误

javascript - 为什么 javascript 在具有共享/部分 View 的 asp.net mvc View 中不起作用

C# 锁(mylocker)不工作

c# - 在 C# 2.0 中保存 Word 2007 文档属性