なぜ構造体のsizeofは、C/C++で各メンバーのsizeofの合計と一致しないのか?
構造体の sizeof の値が、その構造体を構成する各メンバーの sizeof の合計と一致しないことがあります。この差が生じる原因は、パディング(詰め物)とアライメント(整列)です。
C/C++ のすべてのデータ型には、それぞれアライメント要件が定められています。プロセッサにはアーキテクチャ固有のワード長(処理単位)があり、たとえば32ビットマシンでは、1回の処理で扱うワードサイズは4バイト(32ビット)となります。このため、コンパイラはメンバーを効率よく配置するために、メンバー間や構造体の末尾に余分なバイトを挿入します。
コード例
次の例を見てみましょう。
#include <iostream>
using namespace std;
struct X {
char b[3];
int c;
};
int main() {
char b[3];
int c;
int total = sizeof(b) + sizeof(c);
cout << sizeof(X) << endl;
cout << total;
return 0;
}
出力結果
このコードを実行すると、次のような出力が得られます(64ビットマシンでの例)。
8 7
なぜこのような結果になるのか?
構造体 X の場合、まず char> 型配列 b(3バイト)がメモリに配置されます。しかし、その直後に4バイトの int 型メンバー c を続けて配置すると、アライメントのルールに違反してしまいます。そこで、コンパイラは b の末尾に1バイトのパディングを挿入し、c を4バイト境界から開始するように調整します。この余分なパディングが、構造体全体のサイズを大きくしているのです。
つまり、sizeof(X) は 3バイト(char配列)+ 1バイト(パディング)+ 4バイト(int)= 8バイトとなり、単純な合計である7バイトよりも1バイト大きくなります。
アライメントに関するルールについて詳しく知りたい方は、Wikipedia の「Data structure alignment」のページを参照してください。
-
C/C++でn番目のフィボナッチ数を求めるプログラムの書き方
フィボナッチ数列とは、「直前の2項の和が次の項になる」という規則性を持つ数列です。最初の2項は 0 と 1 から始まります。本記事では、フィボナッチ数列のn番目までの値をすべて計算して出力するプログラムを、C/C++を使って解説します。forループを用いて「前の2項の和」を順に求めていく、最も基本的な実装方法を紹介します。入出力例入力:8 出力:0 1 1 2 3 5 8 13n = 8 を指定した場合、8項目までのフィボナッチ数が順番に出力されます。計算の流れ0+1=1 1+1=2 1+2=3 2+3=5このように、直前の2項を足し合わせることで次の項が決まっていきます。これを繰り返すことで
-
三角マッチ棒数を求めるC/C++プログラムの解説と実装例
三角マッチ棒数とはマッチ棒を正三角形の形に並べて作った三角形のことを「三角マッチ棒数(Triangular Matchstick Number)」と呼びます。三角マッチ棒数とは、そのマッチ棒の三角形を作るために必要なマッチ棒の本数を指します。問題の概要この問題では、マッチ棒で作るピラミッドの段数 X が与えられます。そして、X 段のマッチ棒ピラミッドを構成するために必要なマッチ棒の最小総本数を出力するプログラムを作成するのが課題です。概念をより明確にするために、具体例を見てみましょう。入力: 7 出力: 84解法の考え方この問題は、三角数(Triangular Number)の拡張として考える