根据 Mats Petersson 的结果,我做了一些测试。我不需要通过定义宏来打开和关闭断言。我的结论是:
- 包括标准头文件,如
<cassert>
,等<vector>
,<memory>
编译时间很少。我们不需要关心。 - 包含您自己的文件时要小心。包括那些真正需要的,因为依赖项在更改依赖项后需要重新编译。
- 包含类库的集合头时要小心,例如
<QWidgets>
(Qt header to include its all its widgets)。这需要大量的编译时间。
[原帖]
如果每个文件都包含“assert.h”,是否需要很长时间编译?我认为关于“math.h”或其他常见文件的类似问题。我不喜欢预编译的头文件。当我有一个 Vector3D 类时会发生这种情况,该类表示 3D 空间中具有 x、y、z 分量的向量。该类几乎无处不在。我有一个名为component(int i)
wherei
在 0 和 2 之间断言的函数。出于性能原因,我没有将它的实现放在 cpp 文件中。因此,几乎所有地方都包含“assert.h”。
#pragma once
#include <assert.h>
/// A vector in a 3D space with 3 components: x, y, and z.
class Vector3D
{
public:
Vector3D(float x = 0, float y = 0, float z = 0)
{
m_component[0] = x;
m_component[1] = y;
m_component[2] = z;
}
float x() const {return m_component[0];}
float y() const {return m_component[1];}
float z() const {return m_component[2];}
void setX(float x) {m_component[0] = x;}
void setY(float y) {m_component[1] = y;}
void setZ(float z) {m_component[2] = z;}
float component(int i) const
{
assert(i >= 0 && i < 3);
return m_component[i];
}
float& component(int i)
{
assert(i >= 0 && i < 3);
return m_component[i];
}
private:
float m_component[3];
};
受 Floris Velleman 的启发,我添加了一个文件来定义我的 ASSERT 以打开和关闭它。它需要在代码中使用断言更改assert
为。ASSERT
谢谢。
#ifdef USE_ASSERT
# include <assert.h>
# define ASSERT(statement) assert(statement)
#else
# define ASSERT(statement)
#endif