1

Mats Peterssonの結果に基づいて、いくつかのテストを行いました。マクロを定義してアサーションのオンとオフを切り替える作業は必要ありません。私の結論は次のとおりです。

  1. 、、などの標準ヘッダーを含めると<cassert>、コンパイル時間がほとんどかかりません。気にする必要はありません。<vector><memory>
  2. 独自のファイルを含める場合は注意してください。扶養家族は扶養家族の変更後に再コンパイルする必要があるため、本当に必要なものを含めます。
  3. <QWidgets>(すべてのウィジェットを含めるためのQtヘッダー)などのクラスライブラリのコレクションヘッダーを含める場合は注意が必要です。これはコンパイルに非常に時間がかかります。

[元の投稿]

すべてのファイルに「assert.h」が含まれていると、コンパイルに時間がかかりますか?「math.h」やその他の一般的なファイルについても同様の質問だと思います。プリコンパイル済みヘッダーは好きではありません。これは、x、y、zコンポーネントを使用して3D空間のベクトルを表すVector3Dクラスがある場合に発生します。このクラスはほとんどどこでも使用されます。component(int i)whereが0から2の間でアサートされるという名前の関数がiあります。パフォーマンス上の理由から、その実装を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する必要があります。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

はい、私のマシンでは、ファイルごとに0.03秒多くかかります(合計0.1秒、30を超えるファイル、#include <assert.h>またはまたはファイルに入力//#include <assert.h>するための約90行の大きなコメントが含まれています。30回コピーして別のファイルにコピーしました。 cファイル、およびでコンパイルしgcc -c *.cます。

ただし、これはほとんど「何も」コンパイルされていません。代わりに実際のC++コードを使用して、コンパイラーが少し「考える」必要がある場合、どうなりますか。

ベースライン(ソースxx.cpp-スタンドアロンプ​​ログラムで約280行のC ++コード、xx1.cpp .. xx30.cppというファイルに30回コピー、でコンパイルg++ -O2 -c *.cpp):

7.722s      7.730s      7.660s

#include <cassert>のリストの最後に追加

7.734s      7.652s      7.676s

それは大きな変化ではないと思います。#include <assert.h>すべてのヘッダーファイルにインクルードし、数百または数千のヘッダーファイルをインクルードし、すべてにassert.hをインクルードすると、違いが生じる可能性があります。しかし、実際のプロジェクトで実際の違いを誰もが測定できるとは思えません。

于 2013-02-01T22:53:36.763 に答える
2

標準ヘッダーassert.h(引用符の代わりに山括弧を使用しているので、標準Cアサートヘッダーについて話していると思います)は、すべての標準Cライブラリの最小ヘッダーの1つであるため、この場合は実際にはそうではありません。案件。アサーションの有用性は、得られる可能性のある速度よりも重要です。

注: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 に答える