パディングを入れずともアラインメントを適切に保てるのならば、パディングが入ることはありません。使うと、アラインメントの指定をデフォルトよりも厳しい値に強制できます。この機能が必要になる場面はあまりないですが、一応紹介しておきます。キーワードで表され、以下の2つの使い方があります。alignas(整数の定数式)alignas(型名)定数式を指定する場合は、その定数式の結果が新しいアラインメントになります。なる場合は無視されます。処理系が対応していない値はエラーになります。型名を指定する場合は、その型のアラインメントと同じになります。アラインメント指定子を記述できる位置はいくつかあります。記述する位置がやや分かりづらいですが、次のように型名の手前に書きます。複数併記することができ、その場合は一番厳しいものが適用されます。いう考え方で決まります。ストレージ期間には以下の4種類あります。動的ストレージ期間スレッドストレージ期間あるオブジェクトがどのストレージ期間になるかは、オブジェクトをどのように構築したかによって決定されます。このページでは、自動ストレージ期間と静的ストレージ期間について取り上げます。ほかの2つは機会をあらためて説明することにします。サブオブジェクトについては、それが含まれる完全オブジェクトのストレージ期間と同じになります7。ストレージ期間の範囲外のタイミングでオブジェクトにアクセスすることは未定義の動作なので、避けなければなりません。ストレージ期間の終わりを迎えたからといって、わざわざメモリ領域を消去することは時間の無駄なので、メモリ上に値が残ったままになっている可能性はあります。そのような期待をして、アクセスしてはいけません。externキーワードを付加していないものつまり、これまでのページで行ってきた方法で、関数内で定義した変数が該当します。自動ストレージ期間を持つオブジェクトの寿命は、定義を行ったときに始まり、変数の定義を行ったブロックの終わりで終了します。ある関数内で定義した変数が自動ストレージ期間を持つのなら、その関数から抜け出したときには確実に寿命を終えることになります。関数内で定義した変数の参照を返すことが危険なのはこのためです(「関数から値を返す」のページを参照)。関数に入るたびに作り直されているので、メモリアドレスが毎回変わる可能性があります。規格上はそのように強制しているわけではありません。同じ位置で定義したとしても、staticキーワードを付加した場合は、静的ストレージ期間を持ちます。静的ストレージ期間}externキーワードを付加した場合、その変数の定義が別のところで行われていることを示しており、つまり定義ではなく宣言になります。その宣言自体はオブジェクトを構築しません。定義は関数の外側にあり、この場合、静的ストレージ期間を持つことになります。registerキーワードは非推奨の機能であり、使いどころがないので解説は省きます。【C++17】registerキーワードは、仕様からも正式に削除されました(予約語としては残っています)9。いう呼び方をすることがありますが、この用語はストレージ期間が何であるかを無視しています。staticキーワードを付加して宣言されたローカル変数は、静的ストレージ期間を持つため、ローカル変数ではあっても自動変数ではないことに注意が必要です。ブロック内で、staticキーワードを付加して定義した変数staticキーワードを付加したデータメンバ関数の外で定義された変数であり、thread_localキーワードを付加していないもの静的ストレージ期間を持つオブジェクトの寿命は、プログラムの実行開始直後に始まり、プログラムの実行が終わったときに終了します。プログラムを実行しているあいだずっと生き続けており、メモリアドレスも変化しません。前の項ですでに取り上げたとおり、staticキーワードを付加して宣言されたローカル変数は、静的ストレージ期間を持ちます。静的変数は、プログラムの実行が開始した直後、main関数の処理が始まるより前の時点で、オブジェクトが構築されます。静的ローカル変数の場合に、明示的に与えた初期化子による初期化は行われず保留されており、その変数の定義位置を初めて通過するときに初期化されます11。初期化することをいいます。配列や構造体では、すべての要素(サブオブジェクト)に同じことを適用します。12【C言語プログラマー】C言語では、静的ストレージ期間を持つオブジェクトの初期化は、プログラムの実行開始直後に1度だけ行うことになっています。そのため、静的ローカル変数の初期化子は定数でなければなりません。静的ローカル変数を使えば、関数から抜け出したあとも値が保持されるローカル変数を実現できます。}}実行結果:0123456789プログラムが実行されているかぎり寿命が終わらないので、呼び出し元に参照を返して、参照経由でアクセスしても未定義の動作になる恐れはありません。静的ローカル変数は便利なこともありますが、取り扱いが難しくなるケースもあり、基本的には避けておくのが無難です。staticキーワードを付加できます。その場合、そのデータメンバは静的ストレージ期間を持つことになります。