エイリアスがないことを意味する typedef の整数/浮動小数点型を使用して定義する方法はありますか?
同等のもの(ただし、プリミティブな構造):
template < typename T >
struct restrict { T* __restrict data; };
関連する質問として、ポインターのエイリアス/エイリアスなしを決定するものをgccに尋ねることは可能ですか?
エイリアスがないことを意味する typedef の整数/浮動小数点型を使用して定義する方法はありますか?
同等のもの(ただし、プリミティブな構造):
template < typename T >
struct restrict { T* __restrict data; };
関連する質問として、ポインターのエイリアス/エイリアスなしを決定するものをgccに尋ねることは可能ですか?
コメントに記載されているように、新しい C++ コンパイラの多くは、restrict 型修飾子の C99 実装をサポートしています。restrict
は C++ の予約キーワードではないため、コンパイラは通常 or を使用し__restrict
ます__restrict__
。GCCとVisual C++の両方が、C99 への明示的な参照を使用して、これを適切に文書化しています。
C++ 1998 標準では、「指定子は、型指定子以外の任意の種類の指定子とdecl-specifier-seqtypedef
で組み合わせてはならない」と規定されています。基本的に、これは 2 つのcv-qualifiersとを含むtype-specifiersのリストでなければなりません。 const
volatile
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まで適切な最適化を実行しなかったことに注意してください。