型修飾子


Type_qualifier
C、C ++、およびDの プログラミング言語、型修飾子は、あるキーワードに適用されているタイプで、その結果、修飾型。たとえば、const intは定数整数を表す修飾型intですが、は対応する非修飾型であり、単に整数です。Dにおいて、これらは、として知られている種類のコンストラクタ、類推によって、オブジェクト指向プログラミングにおけるコンストラクタ。
型修飾子は、型システムを介して値に関する追加情報を表現し、データの使用の正確さを保証する方法です。型修飾子は通常、C / C ++ファミリーの言語以外では使用されません。多くの言語には定数の概念がありますが、型システムではなく、定数(「変化しない変数」)である名前バインディングによってこれを表現します。 ; 以下の代替案を参照して

コンテンツ
1 言語別
1.1 C / C ++ 1.2 2 構文
3 揮発性-正確さ
4 歴史
5 代替案
6 ノート
7 参考文献
8 外部リンク

言語別

C / C ++
2014およびC11の時点で、標準Cには4つの型修飾子があります:const(C89)、volatile(C89)、restrict(C99)および_Atomic(C11)–後者には、ユーザー定義名との衝突を避けるためのプライベート名がこれらの最初の2つ、constおよびvolatile、はC ++にも存在し、C ++の唯一の型修飾子です。このように、用語「C ++におけるCV -qualifiedタイプ」(のためのCとonst V「という用語ながらしばしば、「修飾型」のために使用されるolatile)C及び」-qualifiedタイプ「V -qualifiedタイプが」ときの一方のみに使用されます修飾子は関連性が
これらのうちconst、CおよびC ++標準ライブラリに表示され、const-correctnessを満たさなければならないこれらの言語の重要な使用法で遭遇する、最もよく知られていて最も使用されているものです。他の修飾子は低水準プログラミングに使用され、そこで広く使用されていますが、一般的なプログラマーが使用することはめったにありません。ただしvolatile、しばらくの間、スレッド化中の同期のために一部のC ++プログラマーによって使用されていましたが、これは推奨されておらず、現在ほとんどのコンパイラーで機能し

NS
Dで型コンストラクタはconst、immutable、shared、およびinout。immutable強い変異体であるconstことができるデータを示し、決してその値を変更しないが、一方では、constこの参照によって変更することができないデータを示す:それは一定であるビューおそらく可変データに関する。sharedマルチスレッドの共有データに使用されます(volatileC ++で簡単に使用されたように)。inoutは、データを変更しない(したがって、データの非修飾型のみに関係する)関数が入力と同じ修飾型を返すことを許可するために使用されるワイルドカードです。constまたimmutable、ストレージクラス指定子としても使用できます。

構文
参照:
C構文§型修飾子
CおよびC ++では、1つ以上の型指定子、およびオプションで型修飾子を指定することにより、関数宣言または変数宣言で型を指定します。たとえば、整数変数は次のように宣言できます。
int x ;
ここintで、は型指定子です。符号なし整数変数は、次のように宣言できます。
unsigned int x ;
ここで、unsignedとintは両方とも型指定子です。定数の符号なし整数変数は、次のように宣言できます。
const unsigned int x ;
ここconstで、は型修飾子であり、修飾型はxでconst unsigned intあり、非修飾型はunsigned intです。
変数宣言には、さらにオプションのストレージクラス指定子がにもかかわらず適切これは、タイプとは異なる別のトピックであり、const変数宣言にされ、また、それは読み取り専用メモリに記憶することができる、すなわちことを、ストレージ・クラスの意味を有すると解釈します。

揮発性-正確さ
参照: Const-correctness CおよびC ++のもう1つの修飾子はvolatile、オブジェクトがプログラムの外部でいつでも変更される可能性があるため、アクセスするたびにメモリから再読み取りする必要があることを示します。
修飾子は、ハードウェアを直接操作するコード(組み込みシステムやデバイスドライバーなど)およびマルチスレッドアプリケーション(そのコンテキストでは誤って使用されることがよく揮発性変数の外部リンクを参照)で最もよく見られます。それとまったく同じ方法で使用することができるconst変数、ポインタ、参照、およびメンバ関数の宣言で、実際には、volatile時々同様の設計による契約戦略を実装するために使用されるアンドレイアレキを呼び出しvolatile、-correctnessをただし、これはconst-correctnessよりもはるかに一般的ではありません。volatile修飾子はまたによって剥離することができconst_cast、それはと組み合わせることができconst、このサンプルのように、修飾子。
//ハードコードされたメモリ位置にマップされる//読み取り専用ハードウェアレジスタへの参照を設定します。const volatile int &hardwareRegister = * reinterpret_cast < int *> (0x8000 );
int currentValue = HardwareRegister ; //メモリ位置を読むint型newValueに= hardwareRegister 。//もう一度お読みください
HardwareRegister = 5 ; //エラー、constの場所に書き込めません
のでhardwareRegisterありvolatile、それは二つの連続で同じ値は、プログラマがそれを変更することはできませんにもかかわらず、読み込み開催するという保証はありません。ここでのセマンティクスは、レジスタの値が読み取り専用であることを示していますが、必ずしも変更されていないわけではありません。

歴史
タイプ修飾子の概念は、例とともに、導入されたreadonly(後に改名constすることによって)ビャーネ・ストロヴストルップ1981のベル研究所テクニカルメモランダム内部にとに実装クラスとC、の前身C ++。動機について、Stroustrupは次のように書いています。
「これは、スコープと型の規則に従う(つまり、マクロを使用しない)シンボリック定数を定義する方法と、メモリ内のオブジェクトを不変と見なす方法の2つの機能を果たしました。」
constその後、標準化の一部としてCで採用され、ANSI C標準委員会(X3J11)によって発明された別の型修飾子とともにC89(およびそれ以降のバージョン)に表示volatileされます。 volatile 1985年までに登場。そして初期の使用はMIPS用のUNIXカーネルのコンパイルであり、通常の最適化が揮発性変数に適用されるのを防ぐことによって最適化されたコンパイルを可能にしました。noalias 1987年12月のX3J11委員会の会議で、さらなる予選が提案されましたが、却下されました。その目標はrestrict、C99の予選によって最終的に達成されました。の動機は、noaliasを補完するものでしたvolatile。つまり、通常は安全でない最適化でも実行できることを示していました。Ritchieは型修飾子をあまり支持せず、「重みを持たない」と主張しましたが、最終的には標準からの削除については主張しませんでした。noaliasしかし彼は反対し、ドラフトから削除されました。
Javaには型修飾子がなく、著しく省略されていconstます。特に、事後に追加し、標準ライブラリを変更して一貫して使用すると互換性が失われるため、1999年の追加提案は却下されました。しかし、Javaは当初、実際にはキーワードとして使用されていませんが、予約語constであることに注目して、実装の可能性を開いたままにしました。代わりに、Javaにはオブジェクト指向のキーワードがこれは、属性(およびローカル変数)を定数として修飾するために使用されますが、型を修飾するためには使用されません。constfinal

代替案
参照: const-correctness 他の言語は、型ではなく識別子(または名前バインディング)のプロパティの不変性を考慮して、異なるアプローチを取ります。したがって、このような言語には、単一の割り当てを持つ定数識別子(変化しない「変数」に対応)がありますが、定数の正しさの概念はありません。定数は型の一部ではないため、型の不一致の可能性はありません。例としては、定数オブジェクトとキーワードを使用したAda 83constant、 およびfinalキーワードを使用したJavaが

ノート
^ Ada標準では、これを「予約語」と呼んでいます。使用法については、その記事を参照して

参考文献
^ C11:新しいC標準、トーマス・プラム
^ 「ジェネリック<プログラミング>:揮発性-マルチスレッドプログラミングのベストフレンド揮発性、正確性またはあなたのコンパイラはあなたのために競合状態を検出するにはどのように」にアンドレイアレキでC / C ++ユーザー誌C ++の専門家フォーラム
^ Bjarne Stroustrup、「C言語タイプの概念の拡張」、ベル研究所の内部技術覚書、1981年1月5日。
^ 兄弟のライバル関係:CおよびC ++、Bjarne Stroustrup、2002年、p。5
^ nnis M. Ritchie、「 The Development of the C Language Archived 2015-01-10 at archive.today」、2003年:「X3J11では、型修飾子constとvolatileなど、多数の小さな追加と調整も導入されました。わずかに異なるタイプのプロモーションルール。」
^ これは、オーストラリアのUnixシステムユーザーグループニュースレター(AUUGN)に印刷されている、Mike Banahanによるテクニカルトーク「Cプログラミング言語のANSIドラフト標準」(1985年9月13日)のヨーロッパUNIXシステムユーザーグループ(EUUC)会議のメモに記載されています。 )、 Vol 6、No 6、p。73
^ ジョンマシェイ(1991年8月16日)。「Re:RISC vs CISC?スペードをスペードと呼びますか?」。ニュースグループ:  comp.arch。Usenet: [email protected]
^ 「12月以前の修飾子(「const」と「volatile」)でさえその重みを持っているとは確信していないということから始めましょう。それらが言語の学習と使用のコストに追加するものはそうではないのではないかと思います特に「Volatile」は難解なアプリケーションのフリルであり、他の手段でより適切に表現されます。その主な長所は、ほとんどすべての人がそれを忘れることができることです。ライブラリインターフェイスに存在するため、それについて学ぶことは避けられません。それでも、手遅れであるという理由だけで、修飾子の削除については議論しません。」
^ JDK-4211070:Javaは、コードの保守のためにconstパラメーター(C ++など)をサポートする必要があります
^ 1815A、 3.2.1。オブジェクト宣言:「予約語定数がオブジェクト宣言に含まれている場合、宣言されたオブジェクトは定数です。宣言には明示的な初期化を含める必要が定数の値は初期化後に変更できません。サブプログラムおよびエントリのモードの正式なパラメータ、およびモードの一般的な形式パラメータも定数です。ループパラメータは対応するループ内の定数です。定数のサブコンポーネントまたはスライスは定数です。」

外部リンク
C11標準
型構築子