仅限调试的成员

时间:2017-07-10 09:17:35

标签: c++

是否有一种很好的方法可以将某些成员仅包含在程序的调试版本中?

我有一个索引数据结构,我使用了大量实例,如果数据结构的某些内容发生了变化,但是索引没有更新,它会带有一定的状态标志。
状态标志仅用于检查索引的所有使用是否在数据已更改时调用update功能,但出于性能和存储原因,因为存在大量实例且数据结构可能已更改在调用update之前很多,我想保留这些数据仅用于调试版本。

这些标志基本上有两种类型的操作:

  • 设置/重置标志
  • assert未设置标志,即索引的某些部分仍然有效。

有没有更好的方法来实现这一点,而不是使用#ifndef NDEBUG语句来填充我的代码?

注意:在我的特殊用例中,性能影响可能不会那么大,但我仍然在寻找一种通用方法来解决这个问题,因为对于同样的想法可能有更复杂的用例。

1 个答案:

答案 0 :(得分:3)

您可以通过提供具有调试功能的基类来减少#ifdefing的数量:

class
t_MyDebugHelper
{
#ifdef NDEBUG
   public: void
   Set_Something(int value)
   {
       (void) value; // not used
   }

   public: void
   Verify_Something(void)
   {}
#else
   private: ::std::string m_some_info;
   private: int           m_some_value;

   public: void
   Set_Something(int value)
   {
       m_some_value = value;
   }   

   public: void
   Verify_Something(void)
   {
       // implementation
   }
#endif
};

class
t_MyClass
:   public t_MyDebugHelper
{
    public: void
    SomeMethod(void)    
    {
        t_MyDebugHelper::Verify_Something();
        t_MyDebugHelper::Set_Something(42);
        ...
    }
};

此方法不允许您完全删除ifdef,但它允许在主代码逻辑中避免它们。在Release构建中,所有调试助手函数都将导致noop,并且由于空基类优化,t_MyDebugHelper类不会增加目标类大小。如果调试助手需要访问t_MyClass方法,则可以应用CRTP