C++の属性
属性は、コードが異なるコンパイラーで実行される場合に物事を標準化するためのC++の最新の方法です。属性は、条件(制約)の適用、最適化、および必要に応じて特定のコード生成を行うために使用される追加情報を提供するために使用されます。
これらは、コンパイラがコードのパフォーマンスを向上させる強制を行うための情報マニュアルのようなものです。 属性はC++11で最初に見られました それ以来、プログラミング言語の重要な部分です。また、すべてのバージョンで、より強力で優れたものにするために、いくつかの改訂が継続的に行われています。
C++で属性を定義する方法を見てみましょう
C ++のバージョンが異なれば、属性を定義するための構文も異なります。
C++11で属性を作成するための構文-
[[attribute-list]]
C++17で属性を作成するための構文-
[[using attribute-namespace : attribute_list]]
C ++ 20で属性を作成するための構文(まもなく公開されます)-
[[contract-attriubute-token contract-level-identifier : expression]]
変数、関数、クラスで多くの属性を使用できます。
これで、属性とは何か、属性がどのように機能しているか、および属性がどのように定義されているかがわかったので。 C++で使用できるさまざまな標準属性を見てみましょう。
C++11で導入された属性
ノーリターン −この属性は、関数が値を返さないことをコンパイラーに通知するために使用されます。
構文
[[noreturn]]
例
[[noreturn]] void f();
この関数は、voidでさえも、値を返しません。
noreturn属性をC++で使用すると、無限ループやエラーの場合のように、何か問題が発生し、フローが呼び出し元のコードに戻らない場合に、コンパイラが警告を返すことができます。
キャリー_依存関係 −これは、release-consumeにあるすべての依存関係を定義するために使用され、コンパイラが不要なメモリ消費命令を実行しないことで最適化できるようにします。
構文
[[carries_dependency]]
これは主に、依存関係を宣言するための関数またはパラメーターの宣言で使用されます。
非推奨 −これは、コードで非推奨のエンティティを定義するために使用されます。この非推奨のエンティティの使用は許可されていますが、使用することはお勧めしません。
構文
[[deprecated]] [[deprecated (reason)]]
理由は、減価償却が行われる理由を示し、非推奨のエンティティの代替手段を提供する文字列です。
非推奨にできるエンティティは、クラス、構造体、共用体、typedef-name、静的メンバー、関数、名前空間、列挙型です。
フォールスルー −これは、次のケースへのフォールスルーが意図的なものであることをコンパイラーに示すために使用されます。これにより、コンパイラーはフォールスルーを警告しません。
構文
[[fallthrough]]
フォールスルーは、次のケースが定義されているため、スイッチでのみ使用できます。
nodiscard −これは、void呼び出しにキャストする代わりに、破棄された値式から列挙を返す関数に使用されます。コンパイラも警告を発します。
構文
[[nodiscard]] [[nodiscard (reason)]] (added in C++ 20)
理由は、結果を破棄しない理由を提供するために使用される文字列であり、これはc++20に含まれます。
maybe_unused −これは、未使用のエンティティの場合に表示される警告を抑制または排除するようにコンパイラに指示するために使用されます。
構文
[[maybe_unused]]
may_unusedとして宣言できるエンティティは、クラス、構造体、共用体、typedef-name、静的メンバー、関数、変数、列挙型です。
可能性が高い、可能性が低い −これらは、代替パスが現在の実行よりも多かれ少なかれ可能性が高い天気を定義するために使用されます。
構文
[[likely]] [[unlikely]]
これらは通常、ラベルやステートメントなどのプログラムのフローを変更するエンティティに適用されます。
no_unique_address −これは、特定のアドレスを持つ必要のないデータメンバーを定義するために使用されます。これは通常、非静的データメンバーがメモリ割り当てを定義する必要がない場合に使用されます。
構文
[[no_unique_address]]
これは、コンパイラが通常の変数とno_unique_address変数の間にメモリ位置を割り当てる必要がある場合に役立ちます。コンパイラは前の変数を優先します。
Optimize_for_synchronized −これは、指定された関数の定義を同期ステートメントからの呼び出し用に最適化する必要があることを定義するために使用されます。
構文
[[optimize_for_synchronized]]
optimize_for_synchronizedとして定義された関数は、同期されたブロックのシリアル化を回避します。
期待 −関数を実行するために関数の引数に必要な条件を指定します。
構文
[[expects : condition]]
条件は、実行される関数に対して満たされる条件を定義しました。
これらはすべて、C ++11からC++20までのC++で定義されている属性です。次に、これらの属性がプログラミングで使用される理由、つまり提案された属性が解決するものを見てみましょう。
-
コードに制約を追加するには −多くの場合、属性はコードに意味を追加し、コードをより有効にし、余分な労力を削減します。
-
コンパイラにさらに最適化情報を提供する −フォールスルー、おそらく、maybe_usedなどの一部の属性は、特定の最適化を行うための情報をコンパイラーに提供します。
-
警告とエラーの回避 −プログラマーのロジックがC++による厳格なルールに反する場合があります。これは、一部の属性が機能するようになり、ユーザーが発生する警告を回避または抑制するのに役立つ場合です。
-
C#の属性は何ですか?
属性は、プログラム内のクラス、メソッド、構造、列挙子、アセンブリなどのさまざまな要素の動作に関する情報をランタイムに伝達するために使用される宣言型タグです。 構文は次のとおりです。 [attribute(positional_parameters, name_parameter = value, ...)] Element ここで 属性の名前とその値は、属性が適用される要素の前の角括弧内に指定されます。 位置パラメータは重要な情報を指定し、名前パラメータはオプション情報を指定します。 以下は、C#で事前定義された属性です。 AttributeUsage 事前定義された属性A
-
C#で廃止された属性とは何ですか?
メソッドに廃止された属性がある場合、コンパイラはコンパイル後にコードで警告を発行します。 新しいメソッドがクラスで使用されていて、それでも古いメソッドをクラスに保持したい場合は、古いメソッドの代わりに新しいメソッドを使用する必要があるというメッセージを表示することで、そのメソッドを廃止としてマークできます。 以下は、廃止された属性がどのように使用されるかを示す例です- using System; public class Demo { [Obsolete("Old Method shouldn't be used! Use New Method