11

エイリアスがないことを意味する typedef の整数/浮動小数点型を使用して定義する方法はありますか?

同等のもの(ただし、プリミティブな構造):

template < typename T >
struct restrict { T* __restrict data; };

関連する質問として、ポインターのエイリアス/エイリアスなしを決定するものをgccに尋ねることは可能ですか?

4

1 に答える 1

20

コメントに記載されているように、新しい C++ コンパイラの多くは、restrict 型修飾子の C99 実装をサポートしています。restrictは C++ の予約キーワードではないため、コンパイラは通常 or を使用し__restrictます__restrict__GCCVisual C++の両方が、C99 への明示的な参照を使用して、これを適切に文書化しています。

C++ 1998 標準では、「指定子は、指定子以外の任意の種類の指定子とdecl-specifier-seqtypedefで組み合わせてはならない」と規定されています。基本的に、これは 2 つのcv-qualifiersとを含むtype-specifiersのリストでなければなりません。 constvolatile

C99 では、修飾子のリストにrestrict.

非標準の typedef で同様のサポートを期待するのは合理的に思え__restrictますが、わかりません!

これをテストする賢い簡単な方法は次のとおりです。

extern void link_fail();

typedef int *__restrict restricted_int_p;

void test(restricted_int_p a, restricted_int_p b) {
    *a = 1;
    *b = 2;

    if (*a == 2) link_fail();
}

link_failこれは、未解決のシンボルがオブジェクト ファイルで見つかった場合、リンカがエラーをスローするという事実を単に利用しています。コンパイラが 2 つの引数を適切に制限している場合、が変更されたa後でも、 の値を認識しているはずです。bしたがって、if ブロックは実行されないため、生成されたオブジェクト ファイルから全体を削除する必要があります。

GCC は少なくともバージョン 3.0 以降は restrict 構文をサポートしていましたが、実際にはバージョン 4.5まで適切な最適化を実行しなかったことに注意してください。

于 2010-05-01T08:08:45.350 に答える