1

C ++では、plain-old-data(POD)ローカル変数はデフォルトで初期化されていません。ただし、初期化されていない変数の値を読み取ろうとすると未定義の動作になるため、これがバグにつながることに気づきました。

コンパイラにすべてのローカル変数を自動的に初期化させる方法はありますか?おそらく、この機能が組み込まれているコンパイラ、またはGCCやClangなどの一般的なコンパイラの1つのコンパイラスイッチですか?私はGnu拡張で大丈夫でしょう。標準である必要はありません。

変数はデフォルトで初期化されると思います。つまり、intは0に設定されます。

intすべてのローカルフィールドとプライベートクラスフィールドを0に割り当てるのは退屈です。

4

2 に答える 2

1

私が知っていることを行うための切り替えはありません。それ存在したとしても、それは単なる「デバッグ」機能であり、本番コードでは使用されません。

例:電気柵ライブラリには、メモリを0またはに初期化するオプションがあります0xff

EF_FILL 0〜255の値に設定すると、割り当てられたメモリのすべてのバイトがその値に初期化されます。これは、初期化されていないメモリの読み取りを検出するのに役立ちます。-1に設定すると、一部のメモリはゼロで埋められ(ほとんどのシステムではオペレーティングシステムのデフォルト)、一部のメモリは最後の使用時に書き込まれた値を保持します。

(自動メモリではなく、割り当てられたメモリに対してのみ機能します)。

標準として定義されていない/標準で定義されていないスイッチに依存すると、コードが移植できなくなります。ある時点で、誰かがあなたのコードを使用して他のプラットフォームでクロスコンパイルし、それは失敗します。

ヘルプ/セーフガードとして、Coverity(注:私はこの会社と提携していません)のようないくつかのツールは、コード内の初期化されていないPODメンバーを検出できます。同じことをする無料のツールがあるかもしれません。

したがって、1つまたは2つのPODメンバー(c ++ 11)の場合に私が行うことは次のとおりです。

class Foo
{
   ...
   private:
      int x = 0;
      int y = 0;
};

数え切れないほどのメンバーがいる場合は、PODクラス/構造体を作成し、このタイプで1つのメンバーを作成し、最も効果的な初期化を使用して0に初期化します。

class Foo
{
   ...
   private:
      struct Pod
      {
        int x,y,z,whatever;
      };
      Pod m = {0};
};

それは、のようなメンバーにアクセスすることを強制しますm.x...透明ではありません

または(少しハッキーかもしれませんが機能します)、POD構造を作成し、そこからクラスを継承します。memsetデフォルトのコンストラクターでPOD構造のサイズに適用できるようになりました

  struct Pod
  {
    Pod()
    {
       std::memset(this,0,sizeof(Pod));
    }
    int x,y,z,whatever;
  };

  class Foo : private Pod
  {
     public:
       ...
      private:
        std::string name;
        std::vector<int> elements;
  };

この値は、のメンバーのみを0に設定sizeof(Pod)することを保証します。memsetPod

Pod変更できないC構造体からのものである場合は、コンストラクターでmemsetステートメントを移動できます。Foosizeof(Pod)

于 2019-03-22T22:19:58.070 に答える
0

初期化されたローカル変数がゼロのLinuxカーネルをコンパイルする提案があります。今年のlinux.confのプレゼンテーションを参照してくださいhttps://youtu.be/FY9SbqTO5GQ?t=742

これを達成するために、プレゼンターチームは実験的なgccスイッチfinit-local-varsを使用しました。パッチはこちらhttps://gcc.gnu.org/ml/gcc-patches/2014-06/msg00615.html

これが最終的にgcc本店に統合され、広く採用されることを願っています。文字通り、私が見たすべてのコードスタイルガイドは、C / C ++コーダーに= 0、変数を定義する場所に明示的なゼロ代入を行うように要求しました。これはエラーが発生しやすく、意味のないサルの作業です。

于 2019-03-23T23:57:15.157 に答える