是否有一种很好的方法可以将某些成员仅包含在程序的调试版本中?
我有一个索引数据结构,我使用了大量实例,如果数据结构的某些内容发生了变化,但是索引没有更新,它会带有一定的状态标志。
状态标志仅用于检查索引的所有使用是否在数据已更改时调用update
功能,但出于性能和存储原因,因为存在大量实例且数据结构可能已更改在调用update
之前很多,我想保留这些数据仅用于调试版本。
这些标志基本上有两种类型的操作:
assert
未设置标志,即索引的某些部分仍然有效。有没有更好的方法来实现这一点,而不是使用#ifndef NDEBUG
语句来填充我的代码?
注意:在我的特殊用例中,性能影响可能不会那么大,但我仍然在寻找一种通用方法来解决这个问题,因为对于同样的想法可能有更复杂的用例。
答案 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。