[解決済み] RustのOption型のオーバーヘッドとは?
2022-12-13 12:22:18
質問
Rustでは、参照は絶対にNULLにできないので、リンクリストのように実際にNULLが必要な場合は
Option
型を使用します。
struct Element {
value: i32,
next: Option<Box<Element>>,
}
単純なポインタと比較して、メモリ割り当てや参照解除のステップなど、どれくらいのオーバーヘッドがあるのでしょうか?コンパイラやランタイムに何らかのマジックがあるのでしょうか?
Option
を実装するよりもコストがかからない、あるいはかからないようにするためのマジックがコンパイラやランタイムにあるのでしょうか?
Option
を非中核的なライブラリで実装する場合よりもコストがかかりません。
enum
を使うか、ポインタをベクターで包むか?
どのように解決するのですか?
そうです、コンパイラのマジックで
Option<ptr>
を単一ポインタに最適化するコンパイラのマジックがあります (ほとんどの場合)。
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>>);
}
以下のようなサイズが出力されます(64bitマシンなのでポインタは8バイト)。
// 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>
の内部で非ヌルポインタの最適化を使用しています。
Option
!
関連
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] JavaScriptでオブジェクトのキー/プロパティの数を効率的にカウントする方法
-
[解決済み] クラスター化インデックスと非クラスター化インデックスの実際の意味は何ですか?
-
[解決済み] Typeから新しいオブジェクトのインスタンスを作成する方法
-
[解決済み] キャッシュフレンドリーコードとは何ですか?
-
[解決済み] Rust の `String` と `str` の違いは何ですか?
-
[解決済み] Dockerコンテナのランタイムパフォーマンスコストとは何ですか?
-
[解決済み】Rustの正確な自動再参照のルールは?
-
[解決済み] なぜSSEスカラーsqrt(x)はrsqrt(x) * xより遅いのですか?
-
[解決済み] translateZ(0)に対するCSSのパフォーマンス
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] forループの中で<と<=のどちらを使うべきか [閉じた状態].
-
[解決済み] CUDAカーネルのグリッドとブロックの寸法はどのように選択するのですか?
-
[解決済み] Scalaのパターンマッチはバイトコードレベルでどのように実装されているのですか?
-
[解決済み] ファイルキャッシュをクリアしてパフォーマンステストを繰り返す
-
[解決済み] OFFSET / FETCH NEXTからの総行数取得
-
[解決済み] なぜSSEスカラーsqrt(x)はrsqrt(x) * xより遅いのですか?
-
[解決済み] Entity Frameworkのクエリは遅いが、SqlQueryの同じSQLは速い。
-
[解決済み] translateZ(0)に対するCSSのパフォーマンス
-
[解決済み] Rでdata.frameをマージ/ジョインする最速の方法は何ですか?