4

我有一个项目,其中有许多具有许多属性的对象,其值总是小于 60、100 和 255 等小数字。

我知道在bytes 上进行数学运算时,有必要转换结果。但除此之外,对所有这些属性使用 abyte或 a有什么缺点吗?short或者另一种看待它的方式,使用bytes 或shorts 代替s 有什么好处int吗?

4

3 回答 3

7

bytes 和shorts 在互操作场景中很有用,在这些场景中,您需要与本机代码预期大小相同的数据类型。

在处理非常大的数据集时,它们还可以节省内存。

于 2011-05-10T02:35:55.820 回答
1

如果您将它们存储在磁盘上,它们会占用更少的空间。但这往往比它的价值更痛苦。

于 2011-05-10T03:07:49.027 回答
1

一般来说,使用有意义的类型。从数据验证、完整性和持久性的角度来看,这可能会有所帮助。

通常,例如,bool由于填充和对齐问题,a 在 32 位架构上实际上会消耗 4 个字节,在 64 位架构上可能会消耗 8 个字节。默认情况下,大多数编译器会优化速度,而不是代码大小或内存使用。对齐访问通常比未对齐访问快。在 .Net 中,其中一些可以通过属性来控制。据我所知,JIT 编译器不会将多个布尔类型压缩为一个整数位字段。

类型也是如此byteStructLayoutJIT 编译器可以压缩多个字节类型(甚至重新排列存储顺序)以共享同一个单词(假设您没有使用和等属性覆盖这种行为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%)。

于 2011-05-10T03:09:00.180 回答