What I mean is, say I have a struct to represent some data and it looks like this:
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;
}
}
A short and two byte values could all fit into 32 bits. What I'm wondering is (for alignment purposes, performance, whatever) if it would actually make sense to store this data in the following format instead:
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); }
}
}
Is this pointless? What would be the benefits/drawbacks?
In .NET, when you are going to use a
structanyway, you can as well decorate the struct withStructLayoutAttributelike this:This will have the effect that the fields are laid out sequentially, e.g. field
Bwill start at offset 16.A value of 1 for
Packmeans that the fields are aligned at thebyteboundaries.