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