2016-09-02 17 views
0

私はcppreference.com、cplusplus.com、およびこのサイト(What is a scalar Object in C++?)で参考資料を見つけることができました。このサイトでは、特定のC++データ型がスカラーかどうかを判断できます。つまり、「参照型、関数型、またはvoid型ですか、そうでない場合は配列、クラス、または共用体ですか?そうでなければ、スカラー型です」というような精神的アルゴリズムを適用できます。コードではもちろん、私はstd::is_scalar<T>を適用することができます。最後に、「スカラー型は加算演算子(算術、ポインタ、メンバポインタ、列挙型、std :: nullptr_t)なしで加算演算子のための組み込みの機能を持つ型です」という作業定義を適用できます。C++型の特性のスカラーの目的は何ですか?

スカラー分類の目的の説明は見つかりませんでした。なぜスカラーなのか誰も気にするのだろうか?動物学分類学における「爬虫類」(「爬虫類はええと鳥や哺乳動物ではない羊の羊」)のような「残余」の分類のようです。私はそれがその厄介さを正当化するためにいくつかの使用を持っているに違いないと思っています。私は、なぜ型が参照であるかどうかを知りたいと思う理由を理解することができます。例えば、参照の参照を取ることはできません。しかし、なぜ人々は何かがスカラーであるかどうかを気にしますか?すべてのスカラーは何ですか?

+1

@JoachimPileborg:私はスカラーが何を意味するのか、アランは考えます:型がスカラーである場合、私が実際に気にかけていた場所はどこでしょうか?私は 'is_scalar'が完全性のために存在すると推測しています。動機づけのあるユースケースからではなく、他の誰かが確かに言うことができます。 – GManNickG

+1

もっと効率的なテンプレートコードを書くかもしれません:より複雑な型へのポインタをコピーするよりも速く渡すことができます。あるいは、アトミックな操作を実装するためにロックを必要とするかもしれませんが、ほとんどのアーキテクチャでは、適切に整列されたスカラーをレジスタに格納し、それをアトミックハードウェア命令として読み取りまたは更新します。 – Davislor

+0

タイプ特性を持つものは、それらが孤立して使用されないか、または何かのタイプがわかっているということです。それらは、テンプレートメタプログラミングおよびSFINAEにおいて、例えば、テンプレート引数のタイプに基づいて特定の関数を選択します。そして、「オーバーロード(演算、ポインタ、メンバポインタ、enum、std :: nullptr_t)のない加算演算子のための組み込みの機能を持つ型」の特殊化が必要な場合、 'std :: is_scalar'は次のようになります。使用する正しい関数。 –

答えて

1

1つの目的は、より効率的なテンプレートの特殊化を作成することです。多くのアーキテクチャでは、オブジェクトへのポインタをコピーするよりもオブジェクトへのポインタを渡すほうが効率的ですが、スカラーはレジスタに収まるようになり、単一の機械命令でコピーできます。あるいは、ジェネリック型はロックが必要な場合がありますが、マシンは1つのアトミック命令で正しく整列されたスカラを読み取ったり更新したりすることを保証します。

+0

これは最も可能性の高い答えだと思います。 AbrahamsとGurtovoyの "C++ Template Metaprogramming"(p。63)は、答えをサポートしています。 "一般的な関数は、参照によってパラメータを受け付けるべきです。スカラーの場合はTを返し、それ以外の場合はTを返します。" – Alan

+0

@Alan:しかし、あなたが' emplace'のような可変関数を呼び出すたびに、スカラーを参照として渡します。 –

+0

スカラーではなく、 'T'のサイズでこの決定をしませんか? – GManNickG

0

ここにcppreference.comの注釈がありますか?

言語機能(例えば、仮想テーブルポインタ)によって使用される隠しメモリ位置を含む、C++メモリモデル内の個々のメモリ位置は、スカラー型を有する(または非ゼロ長の隣接するビットフィールドのシーケンス)。 式の評価、スレッド間同期、依存関係の順序付けにおける副作用の順序付けはすべて、個々のスカラオブジェクトによって定義されます。 is_scalar<T>考える

3

、あなたはどのTのために(つまり、代入、比較およびその逆の、それぞれ)operator=()operator==()operator!=()は、あなたが何を考えないことを確認することができます。

  • aclass Tは、任意の意味を持っていてもいなくてもかまいません。
  • union Tは問題があります。
  • 関数には=がありません。
  • 参照にはこれらのいずれかが含まれることがあります。
  • 異なるサイズの2つの配列の配列 - ウェル、==および!=は、ポインタと比較するために崩壊しますが、=はコンパイル時に失敗します。

したがって、is_scalar<T>がある場合は、これらが一貫して動作することを確認できます。それ以外の場合は、さらに見る必要があります。

+0

他のすべての演算子が期待していることを実行することもできます。 '+ - * /%&| ^〜 '、そう? – Zereges

+1

@lorro: "*それ以外の場合は、さらに見る必要があります。*" is_scalarで始まり、気にしないでください。結局、SFINAEを使って型の比較が可能かどうか判断すると、他の型と同じようにスカラー型にも当てはまります。 –

+0

@Zereges:それらのいくつかは定義されていますが、一部は定義されていません。例えば、上記のリストのいずれも、算術型およびポインタにわたって共通の意味を持たない。これらの型は '!'を '!= 0'と定義することができますが、それは基本的にすべてです。 – lorro

関連する問題