代码之家  ›  专栏  ›  技术社区  ›  SmacL

C++中的位字段有多慢?

  •  10
  • SmacL  · 技术社区  · 15 年前

    我有一个C++应用程序,它包含许多手动控制的位字段结构,类似于

    #define FLAG1   0x0001  
    #define FLAG2   0x0002      
    #define FLAG3   0x0004      
    
    class MyClass
    {
    '
    '
      unsigned Flags;
    
      int IsFlag1Set() { return Flags & FLAG1; }
      void SetFlag1Set() { Flags |= FLAG1; }
      void ResetFlag1() { Flags &= 0xffffffff ^ FLAG1; }
    '
    '
    };
    

    出于明显的原因,我想将其改为使用位字段,比如

    class MyClass
    {
    '
    '
      struct Flags
      {
        unsigned Flag1:1;
        unsigned Flag2:1;
        unsigned Flag3:1;
      };
    '
    '
    };
    

    3 回复  |  直到 15 年前
        1
  •  5
  •   Donal Fellows    15 年前

    这两个例子在速度上应该非常相似,因为编译器在这两种情况下都必须发出几乎相同的位掩蔽指令。为了知道哪一个是最好的,做一些简单的实验。但如果结果没有定论,也不要惊讶;这就是我所预测的。。。

    你最好说位字段是 bool 不过。

        2
  •  5
  •   James    15 年前

    除非这是一个非常紧密的循环,否则在性能上两者之间没有什么可供选择的,如果性能真的很重要,请使用bools(即可能是32位值)。

    使用只有三个这样的单位字段的结构仍然可以填充到 至少 32位。如果您完全专注于尽可能地节省每一位,请查看编译器关于结构中对齐和填充的文档。

    支持位字段的一个原因是它们使代码更整洁,并且不应低估可维护性的重要性。与程序员时间相比,计算机时间是便宜的!

        3
  •  2
  •   mpez0    15 年前

    针对这类问题的一般建议:设置一个简单的程序,尽可能精确地比较您的情况(操作、硬件等),并自己测量性能差异。

    对于这个关于位域与掩蔽的问题,我怀疑您是否会看到显著的性能差异—根据编译器的不同,位域代码可能需要比掩蔽多一个或两个移位。你需要回答的是,在你的应用程序中,这一点是否值得注意。例如,掩码可编程嵌入式代码和桌面应用程序在考虑因素上有很大的不同。

    推荐文章