C のすべてのポインターは同じサイズですか? 驚くべき答え。

Patricia Arquette
リリース: 2024-10-26 19:13:02
オリジナル
926 人が閲覧しました

 Do All Pointers in C   Have the Same Size?  The Surprising Answer.

C ではすべてのポインターのサイズは同じですか?

C では、ポインタはメモリの管理とデータへのアクセスにおいて重要な役割を果たします。しかし、それらはすべて同じサイズ制約に従っているのでしょうか?驚くべきことに、答えはイエスでもありノーでもあります。

C 標準のスタンス

メモリ アドレスとしての固有の性質により、すべてのポインターが同じサイズを共有すると仮定したくなりますが、C 標準では、この仮定が当てはまる特定のケースを明示的に説明しています:


  1. void は char ([basic.compound]/5)
  2. T const、T volatile、および T const volatile と同じサイズです は T と同じサイズです。これは、同じ型の cv 修飾されたバージョンがレイアウト互換性を示し、レイアウト互換型へのポインタが同等の値表現 ([basic.compound]/3) を持っているという事実に由来しています。

  3. 同様に、ポインタも同じ基礎となる型を持つ enum 型は同じサイズ ([dcl.enum]/9) を共有します。

実際の現実< ;/p>

実際には、クラス型へのポインタは通常、同じサイズ制約に従います。その理由は、クラス型が不完全な場合でも、そのポインター型のサイズを取得できるという標準要件にあります。これにより、コンパイラに制限が課せられ、クラスの内部構造を完全に把握せずにポインタ型のサイズを決定することが強制されます。

コンパイラは、サイズの差異を導入する柔軟性を保持しています。クラス接頭辞に基づいてポインターを区別するなど、この方法は実際のシナリオでは一般的ではありません。

ほとんどの場合、次のサイズの等価性も実際には当てはまります:< ;/p>


  • 関数型へのポインタは同じサイズです。
  • データ メンバーへのポインタは同じサイズです。
    < li>関数メンバーへのポインターは同じサイズを持ちます。

これらの等価性は、情報を失わずに特定のポインター型間のキャストを再解釈できる機能から生じます。コンパイラーは技術的にパディングのバリエーションを導入できますが、そうすることを実際に正当化する根拠はありません。

ルールの例外

ただし、「近い」ポインターと「遠い」ポインターを持つセグメント化されたアーキテクチャでは、サイズの違いが発生する可能性があります。一般規則からのこの相違は、注目に値する例外です。

結論として、C 標準ではポインター サイズの変更の可能性が許容されていますが、実際のアプリケーションでは、ほとんどのポインターは以下に準拠しています。同じサイズの制約。この一貫性により、メモリ管理が簡素化され、コードの可読性が向上します。

以上がC のすべてのポインターは同じサイズですか? 驚くべき答え。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!