gpt4 book ai didi

c++ - 摆脱#ifndef NDEBUG

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

我的大部分类都有调试变量,这使得它们通常看起来像这样:

class A
{
// stuff
#ifndef NDEBUG
int check = 0;
#endif
};

方法可能如下所示:

for (/* big loop */) {
// code
#ifndef NDEBUG
check += x;
#endif
}

assert(check == 100);

没有什么比所有这些#ifndef NDEBUG 更丑陋的了。不幸的是,我知道没有编译器可以在没有这些 #ifndef 的情况下优化 check 变量(我不知道这是否被允许)。

因此,我试图想出一个能让我的生活更轻松的解决方案。这是现在的样子:

#ifndef NDEBUG

#define DEBUG_VAR(T) T

#else

template <typename T>
struct nullclass {
inline void operator+=(const T&) const {}
inline const nullclass<T>& operator+(const T&) const { return *this; }
// more no-op operators...
};

#define DEBUG_VAR(T) nullclass<T>

#endif

所以在 Debug模式下,DEBUG_VAR(T) 只是生成一个 T。否则它生成一个只有空操作的“空类”。我的代码看起来像这样:

class A {
// stuff
DEBUG_VAR(int) check;
};

然后我就可以像使用普通变量一样使用 check 了!惊人的!但是,还有2个问题我无法解决:

<强>1。它仅适用于 int、float 等。

“空类”没有 push_back() 等。没什么大不了的。大多数调试变量无论如何都是整数。

<强>2。 “空类”是 1 个字符宽!!

C++ 中的每个类至少有 1 个字符宽。因此,即使在 Release模式下,使用 N 个调试变量的类也将至少有 N 个字符太大。这在我看来是不能接受的。这违背了我尽可能追求的零开销原则。

那么,我该如何解决第二个问题?是否有可能在不影响非 Debug模式下的性能的情况下摆脱#ifndef NDEBUG?我接受任何好的解决方案,即使它是您最黑暗的 C++ 巫术或 C++0x。

最佳答案

怎么样:

#ifndef NDEBUG
#define DEBUG_VAR(T) static nullclass<T>
#endif

现在没有额外的存储被添加到一个类中,其中 DEBUG_VAR(T) 被用作成员,但是声明的标识符仍然可以像成员一样使用。

关于c++ - 摆脱#ifndef NDEBUG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5017099/

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