
[英]C# - Trying to convert two bytes to ushort resulting to “Cannot implictly convert type 'int' to 'ushort'” error
[英]Memory efficient type to store 8 bytes and 2 ushort values
我需要创建一个行数组。 每行将包含八个 1 字节数字 (0-255) 和两个 2 字节 ushort 数字 (0-65535)。 我将在 memory 中同时保留数百万(如果不是数十亿)这样的行。如果我专注于优化 memory 的使用,那么用于构造此类行的最佳类型是什么? 我使用64位操作系统。
我在想简单的Tuple
,像这样:
new Tuple<byte[], ushort, ushort>(byteArray, 1, 2);
或结构:
public struct Row
{
public Row(byte[] bytes, ushort val1, ushort val2)
{
Bytes = bytes;
Val1 = val1;
Val2 = val2;
}
public byte[] Bytes { get; set; } = new byte[8];
public ushort Val1 { get; set; }
public ushort Val2 { get; set; }
}
或结构,但没有字节数组? 像这样:
public struct Row
{
public byte B1 { get; set; }
public byte B2 { get; set; }
public byte B3 { get; set; }
public byte B4 { get; set; }
public byte B5 { get; set; }
public byte B6 { get; set; }
public byte B7 { get; set; }
public byte B8 { get; set; }
public ushort Val1 { get; set; }
public ushort Val2 { get; set; }
}
我认为数据本身将占用 12 个字节(或者 16 个字节?)。 但我不确定 memory 将用于我不知道的其他内容。 比如数组长度? 我应该使用List
而不是数组吗?
我应该避免使用数组,并将每个字节存储在单独的属性中吗?
我应该使用int
而不是ushort
吗? 如果无论如何一行都需要 16 个字节,那么将int
用于 Val1 和 Val2 不是更好吗?
需要注意的是,一旦创建了这个包含数十亿行的列表,稍后将在算法中更改/更新一些值。 不确定为此选择完美类型是否重要。
感谢您的建议和帮助!
最后一个选项看起来是最有效的。 如果你想让它像有一个数组一样工作,你可以试试这个:
struct A {
private ulong bytes;
// allows you to access the bytes like this is an array
public byte this[int i] {
get => (byte)(bytes >> (i * 8));
set {
bytes &= ~(0b11111111 << (i * 8));
bytes |= value << (i * 8);
}
}
public ushort ushort1;
public ushort ushort2;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.