結局C++とRustってどっちが良いの? 2traits

■ このスレッドは過去ログ倉庫に格納されています
2023/04/02(日) 00:42:57.53ID:W9/nq+tL
「C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな」
「うだうだ言ってないで仕事で必要なのをやればいいんだよ、趣味なら好きなのやればいい」

っていうスレ。

前スレ: 結局C++とRustってどっちが良いの?
https://mevius.5ch.net/test/read.cgi/tech/1677286186/
2023/04/26(水) 02:20:44.73ID:V27dNYw1
参照は適当なところで死んでくれるのにRefはそうじゃないのがだるいって言ってんの
2023/04/26(水) 02:37:31.30ID:wGFuhVl0
そんな事例あるか?
Hoge(ref x) = y と
Hoge(x) = &y は完全に同じだろ
複数マッチングなどrefしか使えないこともあるから参照はrefで受けるのが好ましい
2023/04/26(水) 02:54:29.50ID:V27dNYw1
refじゃなくてRefだよ
2023/04/26(水) 03:11:17.63ID:EoYJiu34
RefCellが返すRefやRefMutはロックガードの一種
他のロックを使うときと同じ利用方法でOK
一時利用が終わるかブロックを抜ければ自動解放され快適
2023/04/26(水) 03:13:46.65ID:N0yJtyL8
>>581
いやいやw
ロックじゃありませんからw
2023/04/26(水) 03:33:09.04ID:7yfVI/A5
>>566
それはあなたの使い方が間違っているから。
576, 578 の人も同様。
LinkedListでは、場所のラベルとして、index ではなく pointer を使わなければならない。
それを守ればとても高速。
2023/04/26(水) 03:37:05.06ID:m5i6OxT0
>>586
RefCellはmultiple readers or single writerのロックをして参照や可変参照を借用できる型
RwLockと同じように読み出しは複数可だが書き込みは単独独占となる
同じようにロックガードが消えればロックは自動解放される
ただしRwLockとは異なりスレッド間では使えない
2023/04/26(水) 04:05:00.19ID:RAzLC92N
>>587
君の主張には無理があるな
君の主張通り、各ノードへの直接の各ポインタを保持するならば、それらポインタ群リストを格納する場所はどこか?
その格納場所はベクターか別のリンクリストとならざるをえない
君の主張だと二重管理となりさらに遅くなる
現実には>>578の解説のように挿入や削除ですらリンクリストよりベクターが速くなりうる
2023/04/26(水) 05:12:35.92ID:7yfVI/A5
>>589
全然違います。
特定の要素を覚えるのはアドレス(ポインタ)を番号として用います。
また、そこから隣に移動したい場合は、右隣は、pNextで、左隣は、pPrev
辿っていくことが出来ます。これらはそれぞれ1クロックしかかからないので、
idx++ と同じ速度なので、効率は最高に良いです。
ほとんどの場合、ポインタを覚えるのに別の集合は必要ありません。
もし、必要な場合は、配列の場合でも index を覚えるために別の集合が
必要になるような場合です。
しかし、それは稀です。なので、LinkedListの場合も稀です。
2023/04/26(水) 06:31:44.27ID:nP514kb2
>>590
他の方々はそのような特殊な使い方のみを前提としていない比較だと思いますが、その特殊な場合で比較してみましょう。

前後の要素へポインタを移すために、ptr++とptr--だけで済むのは配列やvectorです。
実際には最大アドレスまたは最小アドレスとの比較も必要ですが、この値もレジスタに持っておくので、比較と増減で2サイクルで済みます。

一方でlinked listの場合、前後の要素へポインタを移すためには、ptr = ptr->nextとptr = ptr->prevそして0との比較になります。
キャシュがヒットしなかったとして、メインメモリから読み出すとすると、100~数百サイクルかかります。
もちろんキャッシュに乗ればマシになりますが、linked listは予想ができません。
このようにポインタの移動だけでも、メモリアクセスが生じるlinked listは非常に不利です。

各要素の内容自体の読み込みは、どちらも同じなりそうですが、少しだけ違ってきます。
vectorならば次々とシーケンシャル読み出しとなり、確実にL1キャッシュに乗りますので、読み出しは4クロック程度で済みます。
linked listはnext/prevを読み出すときに多大なコストを払っているので、内容自体の読み込みはキャッシュに乗ってるでしょう。
しかし、キャッシュに乗ってもnext/prevのサイズ分だけ早くキャッシュから外れるため、やや不利となります。

したがって、前後の要素へのポインタの移動でも、要素の内容読み出しでも、vectorが速くなり、linked listは遅くなります。
2023/04/26(水) 08:16:17.35ID:090dM5ZS
またその話...
状況次第なので
二人ともLinkedHashMapの場合で持論を展開してください
2023/04/26(水) 08:21:46.43ID:e279LTxP
なんでも測ってみないとダメってばーちゃんが言ってた
勉強になるからいいけどw
594デフォルトの名無しさん
垢版 |
2023/04/26(水) 09:51:14.24ID:zYbSfnJu
コンパイラ通せば終わり(キリッ)っていうバカを助長させてるだけだな。
2023/04/26(水) 11:35:48.60ID:N7+hGpB4
自己紹介乙
2023/04/26(水) 12:00:07.23ID:1VlSMqUT
>>576
使い方次第では?
頭から順番にイテレートさせて条件にマッチした場合に不要要素削除や追加する場合は普通に便利だろ?
君がそういう用途を思い浮かべられないんだろ?
2023/04/26(水) 12:25:39.79ID:SBWyUq0g
>>594
バッドノウハウが溜まればどのみちコーティング規約とlintが必要になる。
2023/04/26(水) 12:41:46.92ID:mk8XnWac
>>596
自分も昔はそう思い込んでた
しかし現実のほとんどの用途はvectorでまとめて処理するのが速いと分かった
2023/04/26(水) 13:29:30.45ID:8XaB5QqW
LinkedListはリストの先頭とか要素自身のインデクスを知らなくても前後に要素を差し込んだり自身を削除したりできるから
サイズが不定だったり大きかったりする要素を数珠つなぎにする場合に使える
Linuxカーネルのページ管理でそういうことしてたと思う(今現在は知らないけど)
小さい要素を大量に保持するなら挿入、削除があってもキャッシュしやすいvectorが強そう
2023/04/26(水) 16:36:01.06ID:W7riOQ8m
>>591
嘘か書かないで。
2023/04/26(水) 16:37:03.22ID:W7riOQ8m
591の人はイマジネーションが不足している。
2023/04/26(水) 16:37:48.41ID:W7riOQ8m
591の人を始め、ここの人には、図を書いて考えてみることをお勧めします。
2023/04/26(水) 16:47:25.16ID:e279LTxP
小学校の算数かよ

ごめん俺、小学校の算数躓いた勢だったわww
ちょっと算数系の学習障害 はいってるんかもしれん
604デフォルトの名無しさん
垢版 |
2023/04/26(水) 16:48:15.43ID:9EDgaMeS
月面着陸船が落っこちたそうだが
Rustで書いてれば成功したはず
それにしてもローバーは活躍出来ず流産乙
2023/04/26(水) 17:01:55.60ID:2Da7m8zO
>Rustで書いてれば成功したはず
↑この発想がそのまま↓なんだと言う自覚ゼロ
>コンパイラ通せば終わり(キリッ)っていうバカ
2023/04/26(水) 17:17:57.85ID:D8UGhnWi
>>600
嘘書かないで
2023/04/26(水) 18:28:24.85ID:FJ6FgKNy
>>600
どこの場でも同じだけど
正しい指摘ができずに
嘘!違う!とだけ言い出したら
その人は負けなんですよ
>>591に書かれていること自体は正しいと思いますよ
2023/04/26(水) 18:39:00.36ID:/TEdGcy5
>>607
最後、頭の良さが無い人に教えることは不可能。キリが無いから。
2023/04/26(水) 18:42:01.34ID:/TEdGcy5
言葉ではなく、脳内に画像的なイメージを描かないと駄目ですよ。
全然それが出来てない。
2023/04/26(水) 19:01:03.33ID:4J8YauGV
この人はvector内にガチのclassやstruct入れてるんだな
2023/04/26(水) 19:04:57.37ID:N0yJtyL8
>>596
便利だと思うのは自由だけど
頭から順番にイテレートしてから挿入・削除するような使い方だと
Cache Localityの違いによってVectorより性能が劣る

性能が重要ならLinkedListは挿入・削除時にイテレートが必要ないようにして使う
HashMapとLinkedListを組み合わせたLRUキャッシュとかね
2023/04/26(水) 19:11:34.98ID:4J8YauGV
>>611
ヒープに要素があってvectorがキャッシュされない状態だと要素のメンバーの条件によって削除挿入するなら
vectorの方が不利だよね?
それは理解出来る?
2023/04/26(水) 19:12:21.18ID:4J8YauGV
vectorが は間違えて入ってる
2023/04/26(水) 19:38:13.57ID:qH1OmRtr
>>612
メモリキャッシュ自体はヒープもスタックも関係ないが
もちろんスタック上は常にキャッシュに載るから
上限値が決まっているならば全てスタック上に載せたほうが有利
ヒープは確保と解放のコストもかかるから大きく不利

そのためベクター型でもスタックを利用するものを使うとさらに速くなる
例えばRustはスタックをなるべく多用するために3種類のベクター型が使い分けられている
(1) ArrayVec は上限値を定めてスタックのみを使うベクター型
(2) SmallVec は上限値を定めてその範囲内ならスタックのみを使って超えたらヒープを使うベクター型
(3) Vec はヒープを使うベクター型
それぞれコストとわずかに特性が異なる
2023/04/26(水) 20:22:03.82ID:Pd8SmuYa
https://ideone.com/hqXsfu
シャッフルされた数列を昇順にinsertした
{
std::vector<int> xs;
auto b = std::chrono::system_clock::now();
std::for_each(v.begin(), v.end(), [&xs](int x) {
auto pos = std::find_if(xs.begin(), xs.end(), [x](int y) { return x < y;});
xs.insert(pos, x);
});
auto e = std::chrono::system_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(e - b).count() << std::endl;
}
{
std::list<int> xs;
auto b = std::chrono::system_clock::now();
std::for_each(v.begin(), v.end(), [&xs](int x) {
auto pos = std::find_if(xs.begin(), xs.end(), [x](int y) { return x < y;});
xs.insert(pos, x);
});
auto e = std::chrono::system_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(e - b).count() << std::endl;
}
2023/04/26(水) 20:41:37.78ID:4J8YauGV
>>614
イメージが違うな
シーケンシャルに要素が詰まってるんじゃなくてヒープに乱雑に詰まってる大きめの要素だとキャッシュに乗りにくいだろ
vectorはそのインデックス
2023/04/26(水) 20:45:35.28ID:4J8YauGV
要素としてintが並んでるだけの実際にはないようなパターンの話をされても困るだろ
何らかのオブジェクトが大量にヒープのあちこちに詰まっててvaetorはそのポインタが入ってる
2023/04/26(水) 20:47:03.66ID:4J8YauGV
前にrustスレをずっと荒らしてたおじいさんなのかな?
2023/04/26(水) 20:51:22.56ID:gAezaDDb
>>616
大きなデータだとそういう二段階データ構造にする場合もあるというだけだろう
例えばソートは実体を移動させるよりもインデックスだけ移動させる新たなベクターを設ける
しかしその元の実体もベクターに格納したほうが有利なことが多い
ヒープに乱雑に格納するケースはかなり限られてくる
2023/04/26(水) 20:56:32.56ID:G4JVGBup
>>615
実測いいね
リンクリストが遅い結果になるのは予想できたけど
ベクターの方が10倍以上も速いとは驚いた
2023/04/26(水) 20:57:54.91ID:4J8YauGV
限られてはいないだろ
インサート、デリートを乱雑に繰り返して格納するケースだらけだろ


普通に要素数が分からないし、生成時期も分からないものを突っ込むことが多いんだから
2023/04/26(水) 20:59:39.02ID:xAlX+8Be
横から
>>610
何か問題でも?
2023/04/26(水) 21:01:40.35ID:4J8YauGV
アプリ作ったことないの?
2023/04/26(水) 21:01:40.98ID:NzJ1LltZ
>>621
vectorの方がインサートも速い
比較計測>>615の結果を見ろ
2023/04/26(水) 21:02:25.41ID:4J8YauGV
>>624
intのvector比べて何になるんだよ
2023/04/26(水) 21:03:19.22ID:yGAW9BPT
intじゃなくて256byteぐらいのデータでやってみると逆転したり
2023/04/26(水) 21:06:10.27ID:4J8YauGV
マンデルブロ画像の描画が速いと言ってるのと変わらない無意味な比較
2023/04/26(水) 21:08:39.08ID:NzJ1LltZ
とても大きなデータならば
もう一つインデックス用vectorを用意すればよい
vectorのインサートは速いままだ
2023/04/26(水) 21:32:20.97ID:t/VPhEoq
>>615
リンクリストが唯一勝てそうなinsertまで敗北かよ
知らんかったわ
リンクリストの負けが確定だな
2023/04/26(水) 21:39:12.36ID:2SSTMM1B
データ構造の操作に限ればキャッシュにのるかのらんかで全然違うよな
まあ、リストでもスタック内で作ればいつものるけどね
2023/04/26(水) 21:40:47.62ID:Pd8SmuYa
チョコチョコやっててもキリがないけどとりあえず少しだけ…
これ以上グズグズやってもうざいやろからこれで最後ね

>>626
> intじゃなくて256byteぐらいのデータでやってみると逆転したり
https://ideone.com/8p2nq0
struct foo {
int value, a[(256 / 4) - 1];
foo(int value) : value(value) {}
};
352 ←ベクタ
296 ←リスト
ちな128bytesだとまだベクタが速かった

>>617
> 何らかのオブジェクトが大量にヒープのあちこちに詰まっててvaetorはそのポインタが入ってる
https://ideone.com/8bwMkQ
上記の生ポインタ版。
53 ←ベクタ
245 ←リスト
2023/04/26(水) 21:42:50.60ID:4J8YauGV
このスレを リンクリストで抽出してレスしてる人を見ると1人を除いて多分ほぼ同じ人だと思うわ
2023/04/26(水) 21:43:32.25ID:V27dNYw1
部分列が外から捕捉される場合があって、その場合はメインのリストから取り除かれて以降も長生きして欲しくて、それでRcRefCell使ってるという事情があるんだがなあ
そもそも目的は高速な反復処理じゃなくて状態の管理だし
>>581とかも勝手に途中のノードまでborrow_mut()して平気な顔してるし

まあそういう可能性を考えられない人は単純な構図にして勝ちを取るのに必死なんですね
ご自分の制作物にその知恵が生きるといいですね
2023/04/26(水) 21:49:09.99ID:QxKA8NrO
>>630
どちらもヒープで比較してるからスタックか否かは関係ない
linked listは本質的に遅い
2023/04/26(水) 21:58:07.18ID:xAlX+8Be
moveコンストラクタが働けばサイズ関係ないのでは?
2023/04/26(水) 22:02:01.47ID:4J8YauGV
>>631
よく見たらコードへんじゃない?
linkedlistが不利になるだろそれw
2023/04/26(水) 22:13:00.95ID:yGAW9BPT
前提条件や用途を限定せずに性能議論しても無駄ではある
超長い配列に挿入したり探索したりが同時に発生する場合や
挿入順序維持して末尾に追加したいだけの場合はlinkedlist
2023/04/26(水) 22:16:05.39ID:4J8YauGV
これで収束かな
おじいさん沈黙したから
2023/04/26(水) 22:18:45.74ID:2SSTMM1B
>>634
ベクタだとまとまってるからヒープでもキャッシュにのりやすくね?
2023/04/26(水) 22:36:48.98ID:Pd8SmuYa
>>637
> 挿入順序維持して末尾に追加したいだけの場合はlinkedlist
https://ideone.com/6plvA3
172 ←ベクタ(push_back(foo(i)))
107 ←リスト(push_back(foo(i)))
74 ←ベクタ(reserve(n), push_back(foo(i)))
64 ←ベクタ(reserve(n), emplace_back(i))
105 ←リスト(emplace_back(i))

こんな実測チマチマしてっても意味ないのは同意なのでもう寝ます
性能は状況状況に応じて各自が把握してたら十分と思います
2023/04/26(水) 22:41:35.56ID:4J8YauGV
>>640
さっきのバグレベルのlinkedlistのコードは修正しないで寝るのか
残念
2023/04/26(水) 22:46:15.95ID:X2gXmZqE
のんびりまったりやれよ
Rust勢はめんどくさい、とか言われたいかw

C++は、テスト通りゃいいんだよまであるぜ
いろいろと自由だからね はよunsafe来いw
2023/04/26(水) 22:55:15.76ID:42HUUVU4
>>636
あなたは間違ってるとか嘘とか言うだけで反論として正しいコードや正しい説明を出せたことがありません
そんなことをしていてはまわりから信頼を失いますよ
2023/04/26(水) 23:11:23.22ID:CmiQ78rr
順序維持の追加だけだと>>640のようにベクタもリストもイーブン
しかし追加するだけで終わるわけはなくそれを使うことになる
そうなると結局ベクタが有利

特定の使い方で両端から取り出して使うだけならリストが有利でないか?との疑問はあるだろう
しかしその場合もリストではなく両端キュー(double-ended queue)つまりC++ではstd::dequeueを使う
その内部実装は配列やベクタを利用となっている
2023/04/26(水) 23:17:21.42ID:4J8YauGV
>>643
誰と勘違いしてるのか知らないけど俺は一度も嘘とか言ってないよ

コード見ればわかるけどlist使ってるほうは条件にあった場所で挿入しなくて
また無駄に頭から挿入位置までiterしてるように見えるでしょ?

おじいさんはコードも読めない
2023/04/26(水) 23:39:33.42ID:D3UubLOX
>>633
borrowもborrow_mutもコストは同じだが二度のコストは避けたほうがいいんじゃないか
RefCellはスレッド内部専用だから並行して他のコードがborrowを試みるとこもないしあってはいけない
だからそこはborrow_mutのみで済ませてよい
2023/04/26(水) 23:59:51.46ID:V27dNYw1
>>646
呼び出し元がずっとRef掴んでたら死ぬが
2023/04/27(木) 00:07:20.74ID:0cRM4ow+
>>647
つかまない実現コードがあれば教えて
2023/04/27(木) 00:16:45.43ID:Z1hUQzPQ
他人のことは初心者呼ばわりしておいて自分の見落としも初心者レベルじゃん
誰とは言わんがさすが
2023/04/27(木) 00:29:02.36ID:wpK/WV9k
>>647
Refはロックガードにすぎない
ブロックスコープを抜ければ自動解放
掴んだままになることはない
2023/04/27(木) 05:33:00.85ID:bgaQiY7u
>>647
関数から返すようなことさえしなければ、関数呼び出しが終わるとつかみ続けることはできず、解除される
RAIIを勉強しなさい
2023/04/27(木) 06:57:25.28ID:SOFObBsc
>>645
vectorもlistもその部分は同じコードだぜ
2023/04/27(木) 08:53:10.05ID:T3ZJ5rQy
>>640
(cacheにヒットするかとは別に)cold memoryと言う状態があってbenchmarkの場合は気を付けてください

一応今回のコードでは影響はないと思われます
https://ideone.com/lP1xkO
vector::push_back: 192
256
list::push_back: 113
vector::push_back: 194
reserve, vector::push_back: 81
reserve, vector::emplace_back: 63
list::emplace_back: 111
2023/04/27(木) 10:17:01.26ID:Xs1mJ/iz
>>653
手元でやったらvectorの完勝だった(clang-O3)
それとRamMapのあと何回か試すとcold memory?の影響も出たする

list::emplace_back: 101
vector::push_back: 74
256
list::push_back: 102
vector::push_back: 57
reserve, vector::push_back: 15
reserve, vector::emplace_back: 15
list::emplace_back: 97
2023/04/27(木) 11:18:48.87ID:EX56AJz0
int value, a[(256 / 4) - 1];
この配列aはcopyもmoveもないので計測には意味がないのでは?
656デフォルトの名無しさん
垢版 |
2023/04/27(木) 11:58:43.55ID:JAvmRZYl
ランダムアクセスの性能が重要な状況で
頭からリニアにアクセスする時点で終わってる
2023/04/27(木) 11:59:27.22ID:JkW3E/QM
敢えてdefaultを明示しても特段の変化ないけど、違う話?
foo& operator= ( const foo & ) = default;
foo ( foo&& other) noexcept{
*this = other;
}
2023/04/27(木) 12:18:28.50ID:EX56AJz0
vectorはcapacityが不十分なときにfooのcopy(move)を呼ぶ
fooのデフォルトのcopyもmoveも
aの要素をcopyもmoveもしないので
fooのメンバーにaがある意味がない
2023/04/27(木) 12:33:19.96ID:JkW3E/QM
>>658
C++に不慣れなRust使いさんですか?

fooもgooもmemcpyされてる
https://godbolt.org/z/xMxesqcss

>aの要素をcopyもmoveもしないので
これのソースは?
2023/04/27(木) 13:29:59.90ID:EX56AJz0
>>659
あれ!? すまん
今の今までメンバーの配列は
デフォルトでcopyもmoveもしないのかと思ってた
2023/04/27(木) 13:51:50.04ID:5Zgd55kl
>>543
>>545
コンパイルしてみないとどれだけ容量食うか判らないのは可笑しいな
コンパイル前に今のcrates全部で3GB食うからそれ以上空けてないと
コンパイル開始しないで警告するようなオプション無いかな
2023/04/27(木) 14:41:22.34ID:e+kUEWUi
ポインタをちゃんと理解出来て無い人が、誤った使い方でLinkedListの性能
が悪いと思い込んでいるに一票。
2023/04/27(木) 15:20:28.37ID:W3Pq65Tl
その件は、リニアでもランダムでも個別要素に総なめアクセスするだけの問題→vector+reserveサイズで悩むだけだな

それ以外の状況は千差万別だけど、データ構造を再発明してもしょうがない、知識をつけないとね
>>599みたいな状況→LRUCache→>>592のLinkedHashMap(listと配列のハイブリッド)みたいに
2023/04/27(木) 16:24:47.29ID:usIJ504X
>個別要素に総なめアクセスするだけの問題
なら、Arena方式がOKの場合としてstd::pmr::monotonic_buffer_resourceを使ってみた

vector::push_back: 53
256
vector::push_back: 52
reserve, vector::push_back: 15
reserve, vector::emplace_back: 15
list::push_back: 96
list::emplace_back: 94
list<foo,Arena>::push_back: 22
list<foo,Arena>::emplace_back: 22
2023/04/27(木) 18:52:14.07ID:1NmRe5Ss
>vector+reserveサイズで悩む
見積を間違うとかえって遅くなるんだ(なんで?)
list+Arenaは使いどころがあるかもね

vector::push_back: 58
reserve, vector::push_back: 17 *
reserve, vector::emplace_back: 15 *
80% reserve, vector::push_back: 43 x
80% reserve, vector::emplace_back: 44 x
50% reserve, vector::push_back: 32
50% reserve, vector::emplace_back: 34
20% reserve, vector::push_back: 66 xx
20% reserve, vector::emplace_back: 66 xx
vector<foo,Arena>::push_back: 58
vector<foo,Arena>::emplace_back: 60
list::push_back: 94
list::emplace_back: 95
list<foo,Arena>::push_back: 22 *
list<foo,Arena>::emplace_back: 22 *
2023/04/27(木) 19:26:23.25ID:6exOPbwx
個人的には思ってたより面白い展開だけど
Rustで手を動かして晒す人が出てくるまで
C++側は控えても良いんじゃないかな?

でないと>>604みたいなのが増えるだけや
2023/04/27(木) 19:41:41.02ID:2LPN0u11
>>662
逆やろw
ポインタも知らず実測したこともない子が
listに対して過剰に期待寄せてるだけで
実際C++書いてるやつならもっと冷静よ
2023/04/27(木) 22:08:12.11ID:2KodI8PZ
データ構造の性能比べはスレ違いだからそろそろやめねえか
2023/04/27(木) 22:18:15.37ID:OEMrsx3I
データ追加の計測をしてるようだけど
実際にはその後にそれらデータを使うため
listは各ポインタをたどるところで不利になってしまう

vectorはreserve無しだと再配置コストがかかるけど
最大個数Mのときに再配置コスト累計はM~2Mで固定
使えば使うほど誤差になっていくので
パフォーマンスを気になるような使い方なら無視してよいかと
2023/04/28(金) 00:29:13.98ID:Oq9JkTqn
ここの人達が馬鹿なのは、LinkedListだけ本来の使い方が出来てないこと。
ポインタの使い方が根本的に理解できてないことが分かる。
2023/04/28(金) 00:39:40.76ID:Oq9JkTqn
vectorは、要素のラベルとしてindexを使うが、indexは初心者でも理解し易い。
ところが、LinkedListは、要素のラベルとしてポインタを使う。
ポインタを理解できない人は、いつまでもindexを使おうとする。
それでLinkedListの本来の性能が出ないので、LinkedListはvectorより遅い
と思い込むが、実際はその人の使い方が未熟だからに過ぎない。
多くはキャッシュのせいではなく、その人がまともに使いこなせて無い事が原因。
2023/04/28(金) 00:45:03.56ID:Oq9JkTqn
どうして馬鹿な人に限って「キャッシュのせいで」というかといえば、
キャッシュは、ケースバイケースなので、優秀な人でも断定的に語ることが
できないから、馬鹿な人でも優秀な人と似たような状況になって、能力の差異を
ごまかすことが出来そうに思えてしまうから。
キャッシュは、事を行なう順序によって、本当に千差万別の状況が生まれるし、
CPUの世代によっても変わってきてしまうから、語るのが難しいものであるが、
それ故に、理解力が無いから語れない人も、「ごまかすチャンス」を与える
ことが可能となる誤魔化しのユートピアとなる。
2023/04/28(金) 01:11:32.25ID:s0aPrD/7
コードを出せないキチガイが連投
2023/04/28(金) 01:28:17.16ID:njQSrx5C
>>671
>vectorは、要素のラベルとしてindexを使うが、indexは初心者でも理解し易い。
STLのalgorithmの関数群に渡すときはiteratorのみ
2023/04/28(金) 01:28:26.76ID:Oq9JkTqn
>>673
なんでそんな面倒なことを俺がやらなきゃならないんだよ。
2023/04/28(金) 01:34:03.77ID:sELX9IR8
率直に申し上げると
CとRustの相性は割と良いが
C++とRustの相性は良いとは
(特にテンプレ)言い切れない
即ちCからのリプレースに於いて
Rustが最適解に成り得るのに対し
C++はそのままC++で使い続けるが良かろう
677デフォルトの名無しさん
垢版 |
2023/04/28(金) 01:59:46.36ID:EbgOkl/j
>>672
ケースバイケースじゃないですよ
cache hierarchyとcache localityという常識を学んでください
大昔ならいざ知らず今は大学1年生レベルでみんな習う常識ですよ
2023/04/28(金) 02:05:44.40ID:Oq9JkTqn
>>677
キャッシュは、そういう問題じゃなく、前に何をやったかによって、
キャッシュに乗るかどうかが変わってくると言うことが起きることを
「ケースバイケース」と言っている。
だから、LinkedListにおいて、要素を交換するとしても、ソートの様に
ランダムに近い2つが交換した後のソート後の集合を先頭から最後まで巡る場合には
キャッシュミスが多くなるが、必ず隣り合う前後を交換することを2個おきにやった
場合の集合を最初から最後まで巡る場合は、キャッシュミスはほとんど起きない
という事情がある。
だから、LinkedListで要素を交換すると必ず遅い、というような法則は存在
しない。
2023/04/28(金) 05:07:15.20ID:KTdsk5aJ
間違った使い方をしていると主張するならば
他の人たちのように実際にコードを示して
そして比較計測することで実証しよう
680デフォルトの名無しさん
垢版 |
2023/04/28(金) 07:29:21.75ID:tvIf37hb
>>678
>キャッシュは、そういう問題じゃなく、前に何をやったかによって、
>キャッシュに乗るかどうかが変わってくると言うことが起きることを
>「ケースバイケース」と言っている。
君がそう思って書いてるのはわかってるよ
それが的外れだから勉強したほうがいいよと言ってるんだよ

> 必ず隣り合う前後を交換することを2個おきにやった場合の集合を最初から最後まで巡る場合
この処理がvectorより速くなるとでも?
遅い速いは相対的なものなんだから何と比べてるかくらいはわかるでしょ?
2023/04/28(金) 08:50:10.99ID:gH8UoCJq
Rustはグラフ的な構造が作れないから
単純な構造しか扱わないシステムプログラミングにはC++より
優れてると思う
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況