我有一个项目,其中有许多具有许多属性的对象,其值总是小于 60、100 和 255 等小数字。
我知道在byte
s 上进行数学运算时,有必要转换结果。但除此之外,对所有这些属性使用 abyte
或 a有什么缺点吗?short
或者另一种看待它的方式,使用byte
s 或short
s 代替s 有什么好处int
吗?
byte
s 和short
s 在互操作场景中很有用,在这些场景中,您需要与本机代码预期大小相同的数据类型。
在处理非常大的数据集时,它们还可以节省内存。
如果您将它们存储在磁盘上,它们会占用更少的空间。但这往往比它的价值更痛苦。
一般来说,使用有意义的类型。从数据验证、完整性和持久性的角度来看,这可能会有所帮助。
通常,例如,bool
由于填充和对齐问题,a 在 32 位架构上实际上会消耗 4 个字节,在 64 位架构上可能会消耗 8 个字节。默认情况下,大多数编译器会优化速度,而不是代码大小或内存使用。对齐访问通常比未对齐访问快。在 .Net 中,其中一些可以通过属性来控制。据我所知,JIT 编译器不会将多个布尔类型压缩为一个整数位字段。
类型也是如此byte
。StructLayout
JIT 编译器可以压缩多个字节类型(甚至重新排列存储顺序)以共享同一个单词(假设您没有使用和等属性覆盖这种行为FieldOffset
)。
例如:
struct Foo
{
string A;
short B;
string C;
short D;
}
将引用类型视为指针,上面的大小可能为 16(可能为 14,但与 16 对齐)。
Foo
可以重新排列,使得顺序实际上是:
struct Foo
{
string A;
string C;
short B;
short D;
}
上面的大小可能为 12,对齐为 12 或 16(可能为 16)。
...潜在地,在这个人为的示例中,由于重新排列,您可以节省 4 个字节。请注意,.Net 在重新调整成员方面比典型的 C++ 编译器更具侵略性。
(顺便说一句,我最近在我维护的 C++ 库上花费了一些精力。通过优化成员布局,我能够将内存使用量减少 55%)。