我有一个项目,其中有许多具有许多属性的对象,其值始终小于60,100和255之类的小数。
我知道在byte
上进行数学运算时,有必要转换结果。但除此之外,对所有这些属性使用byte
或short
是否有任何不利之处?或者另一种看待它的方式,使用byte
或short
而不是int
是否有任何优势?
答案 0 :(得分:7)
byte
和short
在互操作方案中非常有用,您需要的数据类型与本机代码所需的数据类型相同。
在处理非常大的数据集时,它们还可以节省内存。
答案 1 :(得分:1)
如果将它们存储在磁盘上,它们占用的空间更少。但它往往更多的是痛苦而不是值得。
答案 2 :(得分:1)
通常,使用有意义的类型。从数据验证,完整性和持久性角度来看,这可能会有所帮助。
通常,例如,bool
实际上在32位体系结构上消耗4个字节,由于填充和对齐问题,在64位体系结构上可能是8个字节。默认情况下,大多数编译器将优化速度而不是代码大小或内存使用。对齐访问通常比未对齐访问更快。在.Net中,其中一些可以通过属性进行控制。据我所知,JIT编译器不会将多个布尔类型压缩为整数位字段。
同样适用于byte
类型。 JIT编译器可以压缩多个字节类型(甚至重新排列存储顺序)以共享相同的单词(假设您没有使用StructLayout
和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个字节。请注意,与典型的C ++编译器相比,.Net更重要的是重新调整成员。
(另外,我最近在我维护的C ++库中花了一些精力。我只能通过优化成员布局来减少55%的内存使用量。)