Looking for c Answers? Try Ask4KnowledgeBase
Looking for c Keywords? Try Ask4Keywords

C Languageエイリアシングと効果的なタイプ


備考

エイリアシングルールの違反とオブジェクトの有効なタイプに違反することは、2つの異なることであり、混乱させるべきではありません。

  • エイリアシングは、同じオブジェクトを参照する2つのポインタabのプロパティで、 b a == bです。

  • データオブジェクトの有効な型は、Cがそのオブジェクトに対して実行可能な操作を決定するために使用されます。特に、有効な型は、2つのポインタが互いにエイリアスできるかどうかを判断するために使用されます。

一つのポインタを介してオブジェクトを変更するので、エイリアシングは、最適化の問題であることができると言う、他のポインタを介して表示されているオブジェクトを変更することができa b 。あなたのCコンパイラは、その型と出所にかかわらず、ポインタが常に互いをエイリアスできると仮定しなければならない場合、多くの最適化の機会が失われ、多くのプログラムが遅く実行されます。

Cの厳密なエイリアシング規則は、どのオブジェクトが互いにエイリアスを行う(またはしない)かをコンパイラのケースが想定する場合を指します。データポインタには常に留意すべき2つの経験則があります。

別の言い方をしない限り、同じ基本タイプを持つ2つのポインタがエイリアスになることがあります。

異なる基本型を持つ2つのポインタは、2つの型の少なくとも1つが文字型でない限り、エイリアスできません。

ここでは基本型は、我々のようなタイプの資格を脇に置くことを意味const場合は例えば、あるa double*bあるconst double* 、コンパイラは変化があることを前提としなければならない一般*a変更されることがあり*b

第2のルールに違反すると、致命的な結果を招く可能性があります。ここで、厳密なエイリアシング規則に違反するということは、実際には同じオブジェクトを指すコンパイラb 、異なる型の2つのポインタabを提示することを意味します。コンパイラは、常に異なるオブジェクトへの2点をとることができる、とのそのアイデア更新されません*bあなたはを通してオブジェクトを変更した場合*a

そうすると、プログラムの動作が未定義になります。したがって、Cはポインタの変換に非常に厳しい制約を課し、誤ってそのような状況が発生するのを防ぐのに役立ちます。

ソースまたはターゲットタイプがvoidでない限り、異なる基本タイプを持つポインター間のすべてのポインター変換は明示的でなければなりません。

つまり、 constなどの修飾子をターゲットタイプに追加するだけの変換を行わない限り、変換はキャストが必要です。

一般的にポインタの変換やキャストを避けると、エイリアスの問題からあなたを保護します。あなたが本当にそれらを必要としない限り、これらのケースは非常に特殊です。できるだけ避けるべきです。

エイリアシングと効果的なタイプ 関連する例