我的意思是,假设我有一个 struct
表示一些数据,它看起来像这样:
struct LilStruct
{
public readonly short A;
public readonly byte B;
public readonly byte C;
public LilStruct(short a, byte b, byte c)
{
A = a;
B = b;
C = c;
}
}
一个
short
和两个 byte
值都可以放入 32 位。我想知道的是(出于对齐目的、性能等目的),将这些数据存储为以下格式是否真的有意义:struct LilStruct
{
private readonly uint _value;
public LilStruct(short a, byte b, byte c)
{
_value = ((uint)a << 16) | ((uint)b << 8) | (uint)c;
}
public int A
{
get { return (int)(_value >> 16); }
}
public int B
{
get { return (int)(_value >> 8) & 0x000000FF; }
}
public int C
{
get { return (int)(_value & 0x000000FF); }
}
}
这是没有意义的吗?有什么好处/缺点?
最佳答案
在 .NET 中,当您打算使用 struct
时无论如何,你也可以用 StructLayoutAttribute
装饰结构体像这样:
[StructLayout(LayoutKind.Sequential, Pack=1)]
struct LilStruct
{
public readonly short A;
public readonly byte B;
public readonly byte C;
public LilStruct(short a, byte b, byte c)
{
A = a;
B = b;
C = c;
}
}
这将导致字段按顺序排列,例如领域
B
将从偏移量 16 开始。Pack
的值为 1表示字段在 byte
处对齐边界。
关于.net - 如果我有三个独立的值都可以放入 32 位,那么使用 uint 来存储它们是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3587593/