コンテンツにスキップ

C言語/alignof

出典: フリー教科書『ウィキブックス(Wikibooks)』

概要

[編集]

alignof は、C11 で導入されたマクロで、オブジェクトまたは型のメモリアライメントを取得するために使用されます。アライメントとは、データがメモリ上で特定のバイト境界に沿って配置されることを指し、これによりアクセス速度やパフォーマンスが最適化されることがあります。C23 では、この alignof が演算子に昇格し、キーワードとして使用できるようになりました。

背景

[編集]

アライメントは、データ型がメモリ上でどのように配置されるかを規定するもので、効率的なデータアクセスにおいて重要な役割を果たします。コンピュータアーキテクチャやプロセッサの設計によって、データが特定の境界で配置されることが最適化されており、アライメントの不一致がパフォーマンスの低下を招く場合があります。

C11では、alignof はマクロとして定義されており、型または変数のアライメントを取得するために使用します。C23では、alignof はキーワードとして昇格し、より直感的に使用できるようになりました。この変更により、コードがより簡潔で読みやすくなり、コンパイラの最適化も向上する可能性があります。

使用方法

[編集]

C11では、alignof はマクロであり、<stdalign.h> ヘッダファイルに含まれている必要があります。C23では、alignof がキーワードとして使用できるため、より簡単に型や変数のアライメントを取得することができます。

C11 の使用例

[編集]

C11 での alignof の使用例は次のようになります。

#include <stdio.h>
#include <stdalign.h>
struct MyStruct {
    char a;
    int b;
};

int main() {
    printf("Alignment of int: %zu\n", alignof(int));
    printf("Alignment of MyStruct: %zu\n", alignof(struct MyStruct));
    return 0;
}

出力例:

Alignment of int: 4
Alignment of MyStruct: 4

ここで、int 型のアライメントは 4 バイトであり、MyStruct 型も 4 バイトのアライメントを持つことがわかります。

C23 の使用例

[編集]

C23 では、alignof はキーワードとして使用できるようになったため、次のように簡潔に記述できます。

#include <stdio.h>
struct MyStruct {
    char a;
    int b;
};

int main() {
    printf("Alignment of int: %zu\n", alignof int);
    printf("Alignment of MyStruct: %zu\n", alignof(struct MyStruct));
    return 0;
}

出力例(C23 の場合も同様):

Alignment of int: 4
Alignment of MyStruct: 4

アライメントの詳細

[編集]

alignof によって得られる値は、型のメモリ配置に関する情報を提供します。例えば、構造体内のメンバのアライメントが異なる場合、全体のアライメントも影響を受けることがあります。次の例では、char 型と int 型が混在する構造体のアライメントを確認できます。

#include <stdio.h>
#include <stdalign.h>
struct MyStruct {
    char a;   // 1 バイト
    int b;    // 4 バイト
};

int main() {
    printf("Alignment of MyStruct: %zu\n", alignof(struct MyStruct));
    return 0;
}

出力例:

Alignment of MyStruct: 4

この例では、char 型のメンバ a は 1 バイトを占めますが、int 型のメンバ b のアライメントが 4 バイトであるため、MyStruct のアライメントは 4 バイトとなります。これにより、b が適切に配置されるために、構造体の先頭にパディングが追加されることになります。

表組みでのアライメント

[編集]

以下の表では、構造体メンバのアライメントとその影響を示しています。

メンバ サイズ (バイト) アライメント (バイト)
a char 1 4
b int 4 4
合計 8 4

ここでは、a のアライメントが 1 バイトであるのに対し、b のアライメントが 4 バイトであるため、構造体のアライメントは 4 バイトになります。アライメントの不一致を防ぐために、パディングが挿入されることがわかります。

結論

[編集]

alignof は、C11 でマクロとして導入され、C23 でキーワードに昇格した重要な機能です。型や変数のアライメントを簡単に取得することで、メモリの配置を最適化し、パフォーマンスを向上させることができます。C11 ではマクロとして使用され、C23 ではキーワードとして使用されるようになったため、今後のコードでは alignof をより直感的に使用できるようになります。