仅调试成员

Debug-only members

本文关键字:成员 调试      更新时间:2023-10-16

有没有一种很好的方法只在程序的调试版本中包含某些成员?

我有一个索引数据结构,我使用了大量的实例,这些实例带有一定的状态标志,以防数据结构的某些内容已更改,但索引尚未更新。
status 标志仅用于检查索引的所有使用是否在数据已更改的情况下调用update功能,但出于性能和存储原因,由于有很多实例并且数据结构可能会在调用之前发生很多更改update,我想仅保留此数据用于调试版本。

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

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

有没有比在我的代码中撒上#ifndef NDEBUG语句更好的方法来实现这一目标?

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

可以通过为基类提供调试功能来减少 #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,但它允许在主代码逻辑中避免它们。在发布版本中,所有调试帮助程序函数都将导致 noop,并且由于空基类优化t_MyDebugHelper类不会增加目标类大小。如果调试帮助程序需要访问t_MyClass方法,则可以应用 CRTP。