2014年4月29日火曜日

GCCでローカル変数のアラインメント指定

GCCでアラインメントを指定するときは__attribute__((aligned(N)));を使うが、今までstaticな変数に対してしか使ったことがなかった。そこで、これはローカル変数でも有効なのか試してみた。以下サンプルコード

#include <stdio.h>
int main(int argc, char *argv[]) {
    char buf_na_0[1];
    char buf_na_1[1];
    char buf_na_2[1];
    char buf_na_3[1];
    char buf_na_4[1];
    char buf_na_5[1];
    char buf_na_6[1];
    char buf_na_7[1];
    char buf_a8_0[1] __attribute__((aligned(8)));
    char buf_a8_1[1] __attribute__((aligned(8)));
    char buf_a16_0[1] __attribute__((aligned(16)));
    char buf_a16_1[1] __attribute__((aligned(16)));
    char buf_a32_0[1] __attribute__((aligned(32)));
    char buf_a32_1[1] __attribute__((aligned(32)));
    char buf_a64_0[1] __attribute__((aligned(64)));
    char buf_a64_1[1] __attribute__((aligned(64)));
    char buf_a128_0[1] __attribute__((aligned(128)));
    char buf_a128_1[1] __attribute__((aligned(128)));
    char buf_a256_0[1] __attribute__((aligned(256)));
    char buf_a256_1[1] __attribute__((aligned(256)));
    printf("&buf_na_0   = %p\n", buf_na_0);
    printf("&buf_na_1   = %p\n", buf_na_1);
    printf("&buf_na_2   = %p\n", buf_na_2);
    printf("&buf_na_3   = %p\n", buf_na_3);
    printf("&buf_na_4   = %p\n", buf_na_4);
    printf("&buf_na_5   = %p\n", buf_na_5);
    printf("&buf_na_6   = %p\n", buf_na_6);
    printf("&buf_na_7   = %p\n", buf_na_7);
    printf("&buf_a8_0   = %p\n", buf_a8_0);
    printf("&buf_a8_1   = %p\n", buf_a8_1);
    printf("&buf_a16_0  = %p\n", buf_a16_0);
    printf("&buf_a16_1  = %p\n", buf_a16_1);
    printf("&buf_a32_0  = %p\n", buf_a32_0);
    printf("&buf_a32_1  = %p\n", buf_a32_1);
    printf("&buf_a64_0  = %p\n", buf_a64_0);
    printf("&buf_a64_1  = %p\n", buf_a64_1);
    printf("&buf_a128_0 = %p\n", buf_a128_0);
    printf("&buf_a128_1 = %p\n", buf_a128_1);
    printf("&buf_a256_0 = %p\n", buf_a256_0);
    printf("&buf_a256_1 = %p\n", buf_a256_1);
    return 0;
}

そして実行結果。

&buf_na_0   = 0x7fff532159df
&buf_na_1   = 0x7fff532159de
&buf_na_2   = 0x7fff532159dd
&buf_na_3   = 0x7fff532159dc
&buf_na_4   = 0x7fff532159db
&buf_na_5   = 0x7fff532159da
&buf_na_6   = 0x7fff532159d9
&buf_na_7   = 0x7fff532159d8
&buf_a8_0   = 0x7fff532159d0
&buf_a8_1   = 0x7fff532159c8
&buf_a16_0  = 0x7fff532159c0
&buf_a16_1  = 0x7fff532159b0
&buf_a32_0  = 0x7fff532159a0
&buf_a32_1  = 0x7fff53215980
&buf_a64_0  = 0x7fff53215940
&buf_a64_1  = 0x7fff53215900
&buf_a128_0 = 0x7fff53215880
&buf_a128_1 = 0x7fff53215800
&buf_a256_0 = 0x7fff53215700
&buf_a256_1 = 0x7fff53215600

結果としてはきちんとアラインメントされた。普通のGCCだけでなく、MavericksのLLVM GCCでもこのattributeは有効なのね。

些末なことだけど、alignmentのカタカナ表記はアラインメントよりアライメントの方がずっと優勢なのか。音的にはアラインメントの方が近い気がするんだが。

0 件のコメント:

コメントを投稿