>>327
なんか左右逆で気持ち悪い(bigendian/littleendianともちょっと違う)
bv.set(31, true);
bv.set(32, true);
assert_eq!(bv.to_bytes(), [
0b_10000001, // 0-
0b_00000010,
0b_00000100,
0b_00001001,
0b_10000000]); // 32-
assert_eq!(bv.storage(), [
0b_10010000001000000100000010000001,
0b_1]);
【超高速】C/C++に代わる低級言語を開発したい 8
330デフォルトの名無しさん
2025/03/25(火) 03:40:11.48ID:ztarSHRB331デフォルトの名無しさん
2025/03/25(火) 08:18:52.12ID:viWlYIzm >>329
すまない、オッサン通り越してお爺さんだから思想も古いんだ。
すまない、オッサン通り越してお爺さんだから思想も古いんだ。
332デフォルトの名無しさん
2025/03/25(火) 08:41:39.56ID:ztarSHRB333デフォルトの名無しさん
2025/03/25(火) 09:02:37.24ID:4yBAp1pH >>330
ビットはそういうものだよ
普通にビット演算すればわかる
let mut bits: u32 = 0;
for n in [0, 7, 14, 21, 28, 31] {
bits |= 1 << n;
}
// u32に詰めているからこうなる
assert_eq!(bits, 0b_10010000_00100000_01000000_10000001);
// bit順(index=0..)にバイトで得る
assert_eq!(bits.reverse_bits().to_be_bytes(), [0b_10000001, 0b_00000010, 0b_00000100, 0b_00001001]);
ビットはそういうものだよ
普通にビット演算すればわかる
let mut bits: u32 = 0;
for n in [0, 7, 14, 21, 28, 31] {
bits |= 1 << n;
}
// u32に詰めているからこうなる
assert_eq!(bits, 0b_10010000_00100000_01000000_10000001);
// bit順(index=0..)にバイトで得る
assert_eq!(bits.reverse_bits().to_be_bytes(), [0b_10000001, 0b_00000010, 0b_00000100, 0b_00001001]);
334デフォルトの名無しさん
2025/03/25(火) 12:13:35.71ID:2SmtLJ6z assert_eq!(bits.storage(), [0b_10010000_00100000_01000000_10000001]);
の結果から想像するに
assert_eq!(bits.reverse_bits().to_be_bytes(), [0b_10000001, 0b_00000010, 0b_00000100, 0b_00001001]);
ではなく
assert_eq!(bits.to_be_bytes(), [0b_10000001, 0b_01000000, 0b_00100000, 0b_10010000]);
の方を期待するのは可笑しいのかなー
正直びっくりエンディアンですわ
の結果から想像するに
assert_eq!(bits.reverse_bits().to_be_bytes(), [0b_10000001, 0b_00000010, 0b_00000100, 0b_00001001]);
ではなく
assert_eq!(bits.to_be_bytes(), [0b_10000001, 0b_01000000, 0b_00100000, 0b_10010000]);
の方を期待するのは可笑しいのかなー
正直びっくりエンディアンですわ
335デフォルトの名無しさん
2025/03/25(火) 19:08:05.91ID:d+t8RnIb byteやword単位のリトルエンディアンじゃなくて
1bit単位のリトルエンディアンだと思えば自然
1bit単位のリトルエンディアンだと思えば自然
336デフォルトの名無しさん
2025/03/27(木) 07:21:00.91ID:vU3T1Sq/ Rustのオペレーターオーバーロードについて質問です
とりあえずtraitを使って
let a: X = X::new();
let b: X = X::new();
let c = a + b;
は出来たのですが
let a = &X::new();
let b = &X::new();
let c = a + b;
だと定義が無いと言われるのでtraitに&のバージョンを追加したら出来ました
ところが
let a = &mut X::new();
let b = &mut X::new();
let c = a + b;
だとまた出来ないのでtraitに&mutバージョンを追加したら出来ました
ところが
let a = &X::new();
let b = &mut X::new();
let c = a + b;
や
let a = X::new();
let b = &mut X::new();
let c = a + b;
や
let a = &X::new();
let b = X::new();
let c = a + b;
が全部出来ません
こういうのはすべての組み合わせをtraitで作っておく必要があるのでしょうか?
それとも一つの表現で全部定義してくれる仕組みは?
とりあえずtraitを使って
let a: X = X::new();
let b: X = X::new();
let c = a + b;
は出来たのですが
let a = &X::new();
let b = &X::new();
let c = a + b;
だと定義が無いと言われるのでtraitに&のバージョンを追加したら出来ました
ところが
let a = &mut X::new();
let b = &mut X::new();
let c = a + b;
だとまた出来ないのでtraitに&mutバージョンを追加したら出来ました
ところが
let a = &X::new();
let b = &mut X::new();
let c = a + b;
や
let a = X::new();
let b = &mut X::new();
let c = a + b;
や
let a = &X::new();
let b = X::new();
let c = a + b;
が全部出来ません
こういうのはすべての組み合わせをtraitで作っておく必要があるのでしょうか?
それとも一つの表現で全部定義してくれる仕組みは?
337デフォルトの名無しさん
2025/03/27(木) 09:14:29.90ID:vU3T1Sq/338デフォルトの名無しさん
2025/03/27(木) 09:22:10.62ID:UV4Rce1I339デフォルトの名無しさん
2025/03/27(木) 09:56:58.93ID:vU3T1Sq/ ああこれinternalなのね
macro_rules! add_impl とか
macro_rules! forward_ref_binop
(unop とか op_assign とかもあるけど)
macro_rules! add_impl とか
macro_rules! forward_ref_binop
(unop とか op_assign とかもあるけど)
340デフォルトの名無しさん
2025/03/27(木) 09:59:54.17ID:vU3T1Sq/341デフォルトの名無しさん
2025/03/27(木) 10:02:25.16ID:vU3T1Sq/342デフォルトの名無しさん
2025/03/27(木) 11:15:21.43ID:vU3T1Sq/ よさげだったけど&mutのが出来なかったorz
343デフォルトの名無しさん
2025/03/27(木) 11:35:25.37ID:vU3T1Sq/ 結局自前でmacroコピペして&mutの定義も追加したらいけたわthx
344デフォルトの名無しさん
2025/03/27(木) 11:46:57.39ID:HDQeQZ5r Copyトレイトは無闇に付けたくないな
345デフォルトの名無しさん
2025/03/27(木) 11:59:13.89ID:JG6/gkrB Trait爆発ですね判ります
346デフォルトの名無しさん
2025/03/27(木) 12:14:45.69ID:UV4Rce1I347デフォルトの名無しさん
2025/03/28(金) 09:26:28.67ID:VPiwRdmL Rust使ってても暗黙のCopyとかに無関心だと【超高速】名乗れなくない?
348デフォルトの名無しさん
2025/04/05(土) 10:41:53.71ID:wy4OM/NR 包丁も食材も上手く使えないと料理は不味い
349デフォルトの名無しさん
2025/04/06(日) 07:52:19.40ID:IvdHyMZx 料理が上手なヤツはRustは使わない
350デフォルトの名無しさん
2025/04/06(日) 23:21:04.80ID:p+WNSwb1 >>347
暗黙のコピーが発生しまくる諸言語とは異なり
RustではCopyトレイト実装型のみ暗黙のコピーが行われるので最もRustが好ましい
具体的にCopyトレイト実装型とは整数値やポインタおよび不変参照であり
それらを用いた複合型は明示的にCopyトレイト実装することもできる
ちなみに整数値などがなぜ暗黙のコピーが起きても構わないかというと
CPUにとってそれらをポインタ経由で間接的に扱う方が遅くなるからであり値をコピーして用いたほうが速いため
暗黙のコピーが発生しまくる諸言語とは異なり
RustではCopyトレイト実装型のみ暗黙のコピーが行われるので最もRustが好ましい
具体的にCopyトレイト実装型とは整数値やポインタおよび不変参照であり
それらを用いた複合型は明示的にCopyトレイト実装することもできる
ちなみに整数値などがなぜ暗黙のコピーが起きても構わないかというと
CPUにとってそれらをポインタ経由で間接的に扱う方が遅くなるからであり値をコピーして用いたほうが速いため
351デフォルトの名無しさん
2025/04/07(月) 10:58:45.39ID:fwcAlCQF はあ…
352デフォルトの名無しさん
2025/04/07(月) 12:23:44.19ID:yN1PvO54 >>349
マにだって料理が得意な奴はいるだろ
マにだって料理が得意な奴はいるだろ
353デフォルトの名無しさん
2025/04/07(月) 14:31:02.06ID:w0rhHNCz354デフォルトの名無しさん
2025/04/07(月) 14:50:26.71ID:k98JYePi355デフォルトの名無しさん
2025/05/02(金) 09:39:27.39ID:k5bGwZZ0 Rustの最大の教訓は、どんな言語でも有名になればバカ(必ずしも頭が悪いわけではなく、本来その言語が想定しない用途に使おうとする奴も含む)が使うってことだろう
Rustの仕様はそれほど効率が重要でない分野でテキトーに使おうとすると無駄なコピーが増えたりしてかえって非効率になりがちな面がある
Rustの仕様はそれほど効率が重要でない分野でテキトーに使おうとすると無駄なコピーが増えたりしてかえって非効率になりがちな面がある
356デフォルトの名無しさん
2025/05/02(金) 18:23:29.41ID:kIVCyVUc >>355
Rustは明示的にclone()を呼んだりCopy実装しないとコピーされないから大丈夫だよ
暗黙にコピーされないから無駄なことをしていればコード見るとすぐバレちゃう
まともなコードは必要な極一部を除いてほとんど参照で渡されるね
ちなみに数値や不変参照(ポインタ)はCopy実装されてるため暗黙にコピーされるけどそれが一番速いから問題なし
Rustは明示的にclone()を呼んだりCopy実装しないとコピーされないから大丈夫だよ
暗黙にコピーされないから無駄なことをしていればコード見るとすぐバレちゃう
まともなコードは必要な極一部を除いてほとんど参照で渡されるね
ちなみに数値や不変参照(ポインタ)はCopy実装されてるため暗黙にコピーされるけどそれが一番速いから問題なし
357デフォルトの名無しさん
2025/05/03(土) 12:05:28.26ID:ekVKJoF2 最適化されることを主張するなら証拠を示すべきなのは当然だが、
コピーの最適化を前提にするのなら例えば安易にCopy実装したりcloneしたりすんな、
みたいな意識高い言説は多くの場合無意味になっちゃうわけだけど、Rustおじはそれでいいのだろうか
コピーの最適化を前提にするのなら例えば安易にCopy実装したりcloneしたりすんな、
みたいな意識高い言説は多くの場合無意味になっちゃうわけだけど、Rustおじはそれでいいのだろうか
358デフォルトの名無しさん
2025/05/03(土) 13:36:23.13ID:BbjMJMxS >>357
頭悪いから違いを理解できないのか?
まずCPUのMOVE命令は全てコピーだ
だから数値や参照(アドレス)がCopy実装されていても何のペナルティも存在しない
むしろ数値や参照を参照で扱う方が間接となり遅い
次にCPUのMOVE命令は全てコピーだがコピー元が使われてなければ純粋なムーブと見なすことができる
そのため最適化が可能で例えば2回のムーブは1回に減らすことができる
これはスタック上の変数を扱う場合も同様でレジスタへMOVEした後にレジスタ間の演算で終わるならスタック上の領域は不要で最適化できる
頭悪いから違いを理解できないのか?
まずCPUのMOVE命令は全てコピーだ
だから数値や参照(アドレス)がCopy実装されていても何のペナルティも存在しない
むしろ数値や参照を参照で扱う方が間接となり遅い
次にCPUのMOVE命令は全てコピーだがコピー元が使われてなければ純粋なムーブと見なすことができる
そのため最適化が可能で例えば2回のムーブは1回に減らすことができる
これはスタック上の変数を扱う場合も同様でレジスタへMOVEした後にレジスタ間の演算で終わるならスタック上の領域は不要で最適化できる
359デフォルトの名無しさん
2025/05/03(土) 13:38:21.80ID:BbjMJMxS RustやC++のムーブも同じで一次的にはコピーをして元を使わないため最適化できる場合が多い
一方でプログラマがコピーやクローンを明示的にした場合は元が生きていて全く異なる
そもそも元も後で使いたいからコピーしているわけだ
だからムーブとは異なり最適化でコピーが消えることはない
もちろん後で使いたい場合はコピーして渡すのではなく参照を渡すのが正解だ
一方でプログラマがコピーやクローンを明示的にした場合は元が生きていて全く異なる
そもそも元も後で使いたいからコピーしているわけだ
だからムーブとは異なり最適化でコピーが消えることはない
もちろん後で使いたい場合はコピーして渡すのではなく参照を渡すのが正解だ
360デフォルトの名無しさん
2025/05/03(土) 13:39:26.21ID:BbjMJMxS したがってプログラマはコピーを可能な限り避けるべきである
暗黙のコピーが行われるプログラミング言語では意識せずコピーしてしまう
プログラムを見ただけですぐにコピーしてあることがわかる方が望ましい
RustではCopyトレイト実装した型のみ暗黙のコピーが起きる
前述のように数値などはその方が有利なので最初からCopy実装されている
ヒープを用いない型ならばプログラマは自由にCopy実装できるがコード上でそれが明示され読む側は気付ける
サイズが大きく参照で扱った方がよい型をCopy実装していればおかしいことがわかる
一方でヒープを用いていればCopy実装はできないがClone実装はできる
これはコード上でfoo.clone()とコピーすることを明示的に記述する必要がある
したがって参照を使えばよいのに無駄なコピーをしていればすぐにわかる
暗黙のコピーが行われるプログラミング言語では意識せずコピーしてしまう
プログラムを見ただけですぐにコピーしてあることがわかる方が望ましい
RustではCopyトレイト実装した型のみ暗黙のコピーが起きる
前述のように数値などはその方が有利なので最初からCopy実装されている
ヒープを用いない型ならばプログラマは自由にCopy実装できるがコード上でそれが明示され読む側は気付ける
サイズが大きく参照で扱った方がよい型をCopy実装していればおかしいことがわかる
一方でヒープを用いていればCopy実装はできないがClone実装はできる
これはコード上でfoo.clone()とコピーすることを明示的に記述する必要がある
したがって参照を使えばよいのに無駄なコピーをしていればすぐにわかる
361デフォルトの名無しさん
2025/05/04(日) 11:58:45.22ID:RkNPiBO2 区別できないバカなのか?
ムーブの時などを含めて実態がコピーになるといってもコピー元は二度と使われないのだから最適化できる
一方でclone()などはコピー元をその後も使うためにコピーしている
コピー元を二度と使わないならclone()の必要がない
そしてコピー元をその後も使うから最適化の前提さえ成立しない
ムーブの時などを含めて実態がコピーになるといってもコピー元は二度と使われないのだから最適化できる
一方でclone()などはコピー元をその後も使うためにコピーしている
コピー元を二度と使わないならclone()の必要がない
そしてコピー元をその後も使うから最適化の前提さえ成立しない
362デフォルトの名無しさん
2025/05/05(月) 10:09:59.16ID:20YqVkB+ RustはC++より描き易いけどC++からの置き換えには不適
RustはCより面倒だけどCからの置き換えには最適
RustはCより面倒だけどCからの置き換えには最適
363デフォルトの名無しさん
2025/05/06(火) 06:06:18.29ID:JTtajrxW 低レベル言語の開発だよね?
皆さんの会話が高級すぎて戸惑いを隠せない。
OS記述も十分に低レベルだけど、ハードウエア操作はもっと低レベルじゃないかな?
皆さんの会話が高級すぎて戸惑いを隠せない。
OS記述も十分に低レベルだけど、ハードウエア操作はもっと低レベルじゃないかな?
364デフォルトの名無しさん
2025/05/06(火) 10:06:47.77ID:K1Pjz07i Rustで低レベルするとunsafeだらけになる
(悪いとは言ってない面倒臭いとは思う)
(悪いとは言ってない面倒臭いとは思う)
レスを投稿する
ニュース
- 習政権、高市首相への態度硬化 台湾有事発言で連日非難 中国 ★11 [ぐれ★]
- 国内ホテル、既にキャンセルも 訪日客関連業界、事態見守る ★3 [蚤の市★]
- 日本損失1.7兆円に修正 中国渡航自粛の影響試算 [蚤の市★]
- 「どうしようもない」 ため息つくアジアの玄関口 中国の訪日自粛で−福岡市 [蚤の市★]
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」 [冬月記者★]
- 「アベノミクス」で投資対象と化したマンション ローンの低金利続き「年収の12倍」借りる20代出現 [蚤の市★]
- 【実況】博衣こよりのえちえち朝こよ🧪
- 中国「高市が頭を下げて謝罪しない限り、絶対に許さない」 [329329848]
- ほかほかご飯にかけるとうまいもの一覧
- 石巻酒田道路
- 女さん「お金を稼げない男に魅力を感じない。イケメン高身長でも底辺なら、チビハゲデブ等生きるに値しない命の仲間に感じる」2042万いい [257926174]
- (*´ω`*)…モキュ……モキュ…
