gpt4 book ai didi

c++ - 仅调试成员

转载 作者:可可西里 更新时间:2023-11-01 16:18:45 25 4
gpt4 key购买 nike

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

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

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

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

有没有比在我的代码中添加 #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,但它允许在主代码逻辑中避免它们。在 Release build 中,所有调试辅助函数都将导致 noop,并且 t_MyDebugHelper 类不会由于空基类优化而增加目标类大小。如果调试助手需要访问 t_MyClass 方法,那么 CRTP可以应用。

关于c++ - 仅调试成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45008148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com