1

根据 Mats Petersson 的结果,我做了一些测试。我不需要通过定义宏来打开和关闭断言。我的结论是:

  1. 包括标准头文件,如<cassert>,等<vector><memory>编译时间很少。我们不需要关心。
  2. 包含您自己的文件时要小心。包括那些真正需要的,因为依赖项在更改依赖项后需要重新编译。
  3. 包含类库的集合头时要小心,例如<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
4

4 回答 4

5

所有标头都使用相同的包含模型,这非常慢。某些标头可能比其他标头更复杂,但一般情况下,您不会包含不需要的标头。

于 2013-02-01T21:47:47.747 回答
3

Yes, it takes, on my machine, 0.03 seconds more per file (0.1s in total, over 30 files, containing either #include <assert.h> or //#include <assert.h> and a large comment of about 90 lines to fill the file out. I copied that 30 times over to separate .c files, and compile with gcc -c *.c.

However, that's pretty much "nothing" compiled. If we instead take some real C++ code, so the compiler has to "think" a bit, what happens:

Baseline (source xx.cpp - around 280 lines of C++ code in a standalone program, copied 30 times to files called xx1.cpp .. xx30.cpp, compile with g++ -O2 -c *.cpp):

7.722s      7.730s      7.660s

Add #include <cassert> at the end of the list of

7.734s      7.652s      7.676s

I don't think that's a significant change. I'm sure if you do #include <assert.h> in every header file, and include hundreds or thousands of header files, that ALL include assert.h, maybe it will make a difference. But I'm doubting anyone would be able to measure a real difference on a real project.

于 2013-02-01T22:53:36.763 回答
2

标准头文件assert.h(你使用尖括号而不是引号,所以我假设你在谈论标准 C 断言头文件)是所有标准 C 库中最小的头文件之一,所以在这种情况下它真的没有事情。断言的有用性比你可能获得的速度更重要。

注意:在 C++cassert中使用而不是assert.h.

另一方面,像 iostream 这样的大而复杂的标头...

于 2013-02-01T21:58:08.413 回答
1
 #ifndef AssertIncluded
 #define AssertIncluded
 #include "assert.h"
 #endif

不是 100% 确定语法,但这可能会消除双重包括的东西。至于速度,编译时间会根据必须发生的事情的数量而增加。包含更多文件意味着:“更长的编译时间”。

于 2013-02-01T21:48:55.497 回答