2016-08-02 3 views
1

私はCやC++に慣れていますが、基本型の大部分には不特定のサイズがあります。私はいつも、さまざまなアーキテクチャ間で効率を提供するために、これらの不特定のサイズが存在すると考えてきました。なぜDの整数型は未定義ではなく固定されていますか?

しかし、RustとDのような言語を使用した後は、
のように、すべての基本/基本型はほとんど固定されています。

なぜDが不特定のサイズの種類を除外することを選択したのですか?
これはマシン間の効率性を妨げませんか?
固定されたタイプの安全性を上回るには、効率に関する懸念が非常に小さいですか?

基本的なタイプとして固定サイズを持たない2つの言語の後に行われたように、私はこの決定に関する文献を見つけることを望んでいました。うまくいけば、これはあまりにもopnionベースではありません。

+1

反対の質問はここにあります:http://stackoverflow.com/questions/35517341/why-sizeof-built-in-types-except-char-is-compiler-dependent-in-cc私は"それは言語を移植性に富んだものにしますが、言語で書かれたプログラムはおそらく移植性に劣ります"。 – Thilo

+1

Javaには型の固定サイズもあります。できるだけ速くコードを作成する必要はなく、コードを書くのが簡単になります。 –

+1

あなたが本当にしたいならば、プラットフォーム固有の型を使うことができます。たとえば、 'size_t'はx86では' uint'、x86_64では 'ulong'であり、' real'はアーキテクチャで可能な限り高い精度です。 – greenify

答えて

4

整数型のサイズが実際にシステム固有でなければならない場合は、D型の固定サイズはありません。 size_tptrdiff_t(ポインタのサイズとどの程度の量のメモリを扱うか)むしろ、適切な固定サイズのタイプのエイリアスです。同様に、c_longc_long_doubleのようなエイリアスは、Cコードと対話するために存在します。 intlongのようなものではDはどちらかの方法で行っていたかもしれませんが、JavaやC#のような他の現代の言語を実行することを選択して行っていました。固定サイズ。

おそらく、固定サイズは実際にです。移植性を改善します。サイズが不明な整数ではなく32ビット整数で動作するコードを記述すると、すべてのプラットフォームで一貫した動作が得られます。これはビット単位の操作のようなものを扱う場合に特に重要ですが、一般的なコードの問題を減らすことができます。より小さな整数サイズの新しいプラットフォームでプログラムをコンパイルしただけで、突然オーバーフローで問題が発生することはありません。新しいプラットフォーム上の整数サイズがコードで適切に機能するように、プログラムの各行を調べる必要はありません。固定の整数サイズでは、プラットフォームの変更時に整数サイズに関連するバグが発生しないことがわかります。したがって、あなたのコードは、可変サイズの整数を使用するコードがそうでないように移植可能です。

Dコードでは、size_tは、サイズがプラットフォームによって異なるため、プログラマにとって問題が発生することがあります。 64ビットプラットフォームでコンパイルされたコードは、longsize_tに割り当て、32ビットプラットフォームでコンパイルしたコードは64ビットでコンパイルしませんプラットフォームの場合はsize_tintに割り当ててください。 C/C++では、Dとは異なり、変換が狭くなるというエラーは発生しませんが、C/C++ルートに移行してもエラーが発生しないため、変換の絞り込みに関するバグを検出するのが難しくなります。 。 Dがプラットフォーム依存のサイズを一般的に使用していた場合、コンパイラがコンパクトであることを確認すると、プラットフォームによってはエラーが発生する可能性が非常に高くなりますが、整数サイズの変更(たとえばオーバーフロー)いくつかのプラットフォームではなく、他のプラットフォームで。整数のサイズを一定にすると、プラットフォーム間でコードの一貫性が保たれます。

以前は、マシンの「ワードサイズ」を使用するほうが効率的でしたが、今日のアーキテクチャでは状況ははるかに複雑です。x86_64マシンは32ビット整数で非常に効率的に動作するため、64ビット整数の方が一般的に効率的になり、32ビット整数ではメモリを使用しないということはかなり疑わしいです。 CPUキャッシュライン(単純にコピーする必要があるメモリが少なくて済むので)が64ビット整数より効率的です。しかし、それはコード、正確なCPU、および実際のワークロードに依存します。現代のx86 CPUは本質的にx86をエミュレートしますが、実際にはフードの下にあるものよりも複雑です(例えば、x86マイクロコードよりも多くのレジスタが現実に存在します)。実行されているものを最適化するために20年または30年前にしなかった。したがって、状況はです。はこれまでよりも複雑であり、整数サイズがマシンのワードサイズと一致するため、パフォーマンスの向上が特に期待されます。これは巨大なオーバーシンプリゼーションです。プロファイリングは、特定のアプリケーションにとって何が最善のものになるかを理解するために必要とされ、多くの場合、あなたが期待するものと完全に反対です。したがって、整数サイズをマシンのワードサイズに一致させることは必ずしも得策ではなく、コードがエラーを起こしやすくなります。

個人的には、私が知っている整数が比較的小さくなり、ビット単位の操作が行われないことがわかっている場合、C++では長年にわたってintしか使用していませんでした。そうでなければ、私はint32_tint64_tのような型を使います。特定のサイズの整数を得るために異なる整数型を使い始めなければならないので、固定サイズの整数を使うのはエラーが起こりにくいので、longまたはshortのような型は使用しません。特定の範囲内にあるタイプを使用するよりも効率的です。そしてそこには同じことをする他の多くの人がいる。そうしないと、32ビットのプログラムを64ビットに移植する必要があるならば、あなたは奇妙で、追跡が難しいすべての種類に遭遇しないように狂ったように祈っているでしょう整数サイズの変更に起因するバグ、どこでも固定サイズの整数を使用した場合、そのような懸念はありません。

可変サイズの整数型の使用は、プラットフォーム固有のバグを募集しているだけであり、パフォーマンスが向上することはよくありません。この時点では、可変長整数は、後に来るほとんどの言語が採用しなかったC-アイムであるように見えます。私が見てきたことから、ほとんどは固定サイズの整数型を主に持つか、またはBigIntに相当し、ハードウェア整数から完全に離れる。 Dはシステム言語なので、組み込みの整数型をBigIntのように動作させるのではなく、固定長の整数で処理しました。

関連する問題