【问题标题】:When to Use a Data Type Other Than int?何时使用 int 以外的数据类型?
【发布时间】:2011-08-22 02:53:38
【问题描述】:

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

我知道在bytes 上进行数学运算时,需要转换结果。但除此之外,对所有这些属性使用byteshort 有什么缺点吗?或者换个角度看,使用bytes 或shorts 代替int 有什么好处吗?

【问题讨论】:

  • 在我看来像是微优化...
  • @EtiennedeMartel,这个问题与优化无关。它是关于理解和做出更好的决定。我更关心那些维护或使用我的代码的人,他们可能想知道为什么我使用字节而不是整数,反之亦然。

标签: c# .net byte int short


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    byte 类型也是如此。 JIT 编译器可以压缩多个字节类型(甚至重新排列存储顺序)以共享同一个字(假设您没有使用 StructLayoutFieldOffset 等属性覆盖此类行为)。

    例如:

    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%)。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2013-05-15
        • 2020-10-22
        • 2012-05-07
        • 2012-07-26
        • 2017-04-05
        • 2015-12-21
        • 2023-03-06
        • 1970-01-01
        • 2021-12-31
        相关资源
        最近更新 更多