は、参照は、nullになることはありません単純なポインタと比較して割付と参照解除の手順は? Option
を、同じenum
構造を使用して非コアライブラリで自分でOption
を実装する場合よりもコストをかけることなく、またはベクトルにポインタをラップすることによって、コストがかからないようにコンパイラ/ランタイムにいくつかの「魔法」がありますか?Rust's Optionのオーバーヘッドは何ですか?</p> <pre><code>struct Element { value: i32, next: Option<Box<Element>>, } </code></pre> <p>どのくらいのオーバーヘッドは、メモリの面で、この中に関与している:あなたは、実際に、このようなリンクリストとして、ヌル必要がある場合には、あなたが<code>Option</code>型を使用するので、錆に
51
A
答えて
55
はい、Option<ptr>
を単一のポインタ(ほとんどの場合)に最適化するコンパイラマジックがあります。 (ポインタが8バイトであるので、64ビットマシン上で)
use std::mem::size_of;
macro_rules! show_size {
(header) => (
println!("{:<22} {:>4} {}", "Type", "T", "Option<T>");
);
($t:ty) => (
println!("{:<22} {:4} {:4}", stringify!($t), size_of::<$t>(), size_of::<Option<$t>>())
)
}
fn main() {
show_size!(header);
show_size!(i32);
show_size!(&i32);
show_size!(Box<i32>);
show_size!(&[i32]);
show_size!(Vec<i32>);
show_size!(Result<(), Box<i32>>);
}
以下のサイズが印刷されている:
// As of Rust 1.22.1
Type T Option<T>
i32 4 8
&i32 8 8
Box<i32> 8 8
&[i32] 16 16
Vec<i32> 24 24
Result<(), Box<i32>> 8 16
注&i32
、Box
、&[i32]
、Vec<i32>
全てが非NULL可能ポインタを使用することOption
内の最適化!
6
この回答は廃止されました。可能であればOption<T>
の判別式が最適化されました。今のところ(提供された情報の残りの部分は、しかし、依然として興味深い。)
、Option
タイプは他enum
型より空間の同じ量を占めます。私は詳細を知らないが、それは確かにある種の差別化された組合として表される。
最適化のために内部表現を微調整する可能性は、Rust開発者によって検討されています。ここで
はパトリック・ウォルトンによって掲示 relevant discussion on the dev mailing list、次のとおりです。ここでは、コンパイラの最適化のための部屋がたくさんありますので、私は、 列挙型の特定のビット表現にコミットすることを躊躇ビットです。 例えば、我々はNULL可能 ポインタに
Option<~int>
を崩壊することをお勧めします、我々はNULL可能 文字列にResult<(),~str>
を崩壊する場合があります、または私達は は、文字列は、トップ256バイトを占有することはできませんと仮定し、1つのワードにEither<u8,~str>
を崩壊する場合がありますアドレス空間の 私はしばらくの間、おそらく には、錆の列挙型のビットパターンが指定されていないと言って、 にできるだけ多くの部屋を最適化して遊ばせると思っていました。
関連する問題
- 1. は<code>synchronize threads</code>に十分であることは、私たちが実際に待機を使用する必要がある場合は、<code>notify</code>と<code>notifyAll</code>メソッドをJavaの
- 2. 空の構造体をC#で新しくすることは何ですか?</p> <pre><code>struct EmptyResult { } </code></pre> <p>インスタンスタイプ<code>EmptyResult</code>の変数を作成した結果がどのようなものです:あなたは、構造体を宣言した場合は
- 3. コンストラクタ関数の作成後にプロトタイプを使用する利点は何ですか?あなたは</p> <pre><code>var SomeClass = function(){ this.a= ""; this.b= ""; } </code></pre> <p>のようなコンストラクタ関数を使用している場合
- 4. Python dir()はJavaScriptでこれに相当しますか?</p> <pre><code>dir(django.auth.models) </code></pre> <p>、それはあなたの<code>models</code>の内側にすべてのものを与えるだろう、何かがあります:私は、Pythonについて愛した何
- 5. 私は角</p> <p>使用<code>next()</code>と<code>saveStep()</code>にフォームを送信する必要があるHTML
- 6. はどのように</p> <pre><code>has_one :company </code></pre> <p>私の要件は、ユーザーがページをサインアップするときに新しい<code>company</code>フォームにリダイレクトするということである
- 7. 私はスナップショットが存在しない場合、私は、このスナップショットから</p> </blockquote> <p></p> <blockquote> <p>「暗闇の中で踊る」を得ることができますどのようにこのFireBase DataSnapshot
- 8. description.Iは任意のウィジェット</em></strong>なくてはQtクイックアプリケーション<strong><em>にQFileDialogを使用する必要があるとして、ファイル
- 9. データ-スライドは<strong>データ・スライド拳<strong>モーダル体</strong>の</strong>サイズはのために異なっています場合、私はここで、ブートストラップモーダル内<strong>カルーセル</strong>効果を使用しようとしているカルーセル
- 10. アップロードとは、この画像は私が<strong><em>CodeIgniterの</em></strong>で何をする必要があるかを示しCodeIgniterの
- 11. <p>は、私が聞いてもどこで、どのように</p> <pre><code>http://domain.com, http://www, https://domain.com </code></pre> <p></p> <pre><code>https://www </code></pre> <p>にリダイレクトするために?</p>あなたのnginxの設定ファイルで
- 12. スウィフト:あなたも行うことができた場合</p> <pre><code>// MARK: This is a comment </code></pre> <p>:としてスウィフトにコメントを書くの目的であるものについて理解// MARK
- 13. は、私が見るにはこちらを</p> <p>私が試してみたい何<code>v_total_project</code>がそのように見えるようにすることである必要がありビュー
- 14. は</p> <p>に修正する必要がある、私は「修正」私は</p> <p><code>"<a href='http://someserver/some url/somepage.htm?param+1=test">Some link</a>"</code></p> <p>のようにHTMLのスニペットを取得していないことができ、入力として
- 15. DBMS_XPLAN.DISPLAY_CURSOR対gather_plan_statisticsを使用していないことDBMS_XPLAN.DISPLAY_CURSORはあなたに<em>実際</em>を与えながらPLANはあなたに<em>理論</em>実行計画を与えるEXPLAIN、ちょうど私が理解から、2の間の差にいくつかの明確化を要求
- 16. は、要求が中国からのものである場合、私は<strong>C#</strong>または<strong>はJavaScript</strong>に「<strong>System.Web.HttpRequest</strong>」から決定することができ、中国
- 17. 私は</p> <p>がどのように私はこのことから、時間</p> <p>をエポック現地時間から変換することができ、あなたの助けをしてください必要PHP
- 18. は、どのように私は<code>string</code>あるこの</p> <pre><code>var alldest = cc.returnallfullDestinations(mainElement).Split('|'); </code></pre> <p><code>returnallfullDestionations</code>のようなデータを取得していますC#
- 19. はプログラムで私はあなたには、いくつかの宝石のパスを表示するために</p> <pre><code>bundle show gem_name </code></pre> <p>を行うことができます知っているバンドラ
- 20. 文字列と整数に対して操作 '&'が定義されていません。</p> <pre><code>numbers(i) = txtValue.Text </code></pre> <p><code>Numbers</code>が</strong>と<code>txtValue.Text</code>が<strong>文字列</strong>ある<strong>整数の配列です:いくつかの理由、それはあなたの問題はここにある
- 21. 私はこれは私がのためにそこに何らかの理由があることを見ていけないDreamweaverのエラーメッセージとコードのスクリーンショット</p> <p><a href="https://i.stack.imgur.com/IseMU.png" rel="nofollow"><img src="https://i.stack.imgur.com/IseMU.png" alt="."></a></p> <p>あるDreamweaverで明らかな理由で
- 22. LINQ ToListがここで使用されないのはなぜですか? <code>source</code>が<code>IEnumerable<T></code>ある</p> <pre><code>using(var iterator = source.GetEnumerator()) {...} </code></pre> <p>:
- 23. は、どのように私は私は2つのセグメントを持っている場合</p> <p>が</p> <p>例であるURI
- 24. オブジェクトがPythonのバイトのようなオブジェクトであるかどうかを判断する適切な方法は何ですか?</p> <pre><code>if isinstance(data, bytes): data = data.decode() </code></pre> <p>残念ながら、これは<code>bytearray</code>の場合には動作しません:
- 25. は、私はあなたが<em>domain.com</em>、それは<em>domain.com.ipaddress.com</em></p> <p>にリダイレクトされます場合はここではメインのコードだとChromeの拡張機能を作成していたURL
- 26. はソートされていないセット<code>A</code><code>x</code>は、いくつかの整数<code>m</code>よりも大きくする必要があることなど<code>A</code>の要素ではない最小の整数<code>x</code>を見つけるための最も効率的なソリューション が何であるかを考えると、アレイ
- 27. tr:ホバーのボーダー半径を<tr>にするには?私は私がしたいことはある、それは<code><table></code>が含まれている大きな<code><div class="content"></code>を持って
- 28. スパーク:私が参加していなかったすべてのレコードをフィルタリングする必要がある場合はどのような</p>今 <pre><code>val joinStream = stream1.join(stream2) </code></pre> <p>、抗参加2 DStreams
- 29. スカーラ:私は必要そのようなスクリプトで</p> <pre><code>#!/bin/sh exec scala "$0" "[email protected]" !# println("Hello") </code></pre> <p>はに起こる瓶のグループ(からクラスをロードするために:あなたはLinuxのシェルスクリプトとしてScalaのスクリプトを実行することができます
- 30. 、いくつかの要素(div要素)は(あなたが<strong>sourceFields</strong>でそれを見ることができます)<strong>フォーム</strong>のうち、どのようにこのページがロードされる方法ではJavaScript
さらに、この最適化はすべての「オプション」風の列挙型で行われるため、ユーザー定義の 'Option'でも動作します。 –