[過去ログ]
Rust part16 (1002レス)
Rust part16 http://mevius.5ch.net/test/read.cgi/tech/1656285423/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
694: デフォルトの名無しさん [sage] 2022/09/10(土) 20:06:33.59 ID:xD3pa07u let bitmap:[u32; LEN] = [0; LEN]; let mut bitmap:[ARGB32; LEN] = unsafe {core::intrinsics::transmute::<_, [ARGB32; LEN]>(bitmap)}; これでいいってことじゃない? 一個目のbitmapは実際書き込んでないからmut不要 二個目のbitmapは変数名同じだけど一個目とは別の変数で、こっちは次の行で書いてるからmut必要 http://mevius.5ch.net/test/read.cgi/tech/1656285423/694
695: デフォルトの名無しさん [sage] 2022/09/10(土) 20:13:43.96 ID:xD3pa07u あぁ言いたいことは分かった 確かにtransmuteしてるからバックエンドの挙動によっては変なことになりうるかもね ただそれは別にmutをつけても保証はされない気がする http://mevius.5ch.net/test/read.cgi/tech/1656285423/695
696: デフォルトの名無しさん [sage] 2022/09/10(土) 20:24:18.78 ID:BhJh8aSd >>691 repr(packed)を指定した構造体のフィールドへのアクセスは未定義動作を引き起こす可能性があるからrepr(packed)は基本的には使わない方が良いよ https://doc.rust-lang.org/nomicon/other-reprs.html#reprpacked 確かにrepr(C)やrepr(Rust)はパディングされる可能性があるけど、フィールドのアラインメントを適切にするために必要なものなので パディングが問題になるならフィールドのメンバーの順序やサイズを見直すか、フィールドの値を読むのに std::ptr
::read_unaligned を使う必要があるよ https://doc.rust-lang.org/std/ptr/fn.read_unaligned.html read_unalignedのドキュメントにも書いてあるけど、アライメントが不適切なフィールドへの参照を作るのすら未定義動作になるという落とし穴もあったり、 repr(packed)な構造体の取り扱いにはいろいろと注意が必要になるので、本当に必要なとき以外は使わない方が良いよ あと、repr(packed)はrepr(packed, Rust)と同じ意味になるので、構造体のフィールドがメモリ上でどのような配置になるかの保証はないよ フィールドの定義順とメモリ上での順序を同
じにしたいのであれば repr(C) または repr(C, packed) と指定する必要があるよ いずれにせよ今回は全てのフィールドがu8だからrepr(C)でパディングが挿入されることはなく 無駄にメモリを消費することもないよ どうしてもパディング挿入が心配なら mem::size_ofやmem::align_ofを使って構造体のサイズとアライメントに関するアサーションを加えるのが良いと思う http://mevius.5ch.net/test/read.cgi/tech/1656285423/696
697: デフォルトの名無しさん [sage] 2022/09/10(土) 20:36:28.31 ID:BhJh8aSd >>693 let a = ...; let mut a = a; みたいに書いた場合、一個目のaと二個目のaは別の変数扱いでそれぞれ個別に領域が割り当てられるよ 二個目のaに格納されるのはaの値で、ポインタじゃないから一個目のaが書き込み不可な領域に格納されていたとしても 二個目のaのために割り当てられた読み書き可能な領域に一個目のaの値がコピーされるような動作になるはず 最適化によって一個目のaと二個目のaが同じ領域を使い回すようになるかもしれないけど、二個目のa定義後
はその領域に対する書き込みは可能なことが保証されてるはず transmuteを呼び出した場合も同じで、 transmute(a) という呼び出しをした場合transmuteに渡されるのはaの値なので、二個目のaの定義後は問題なくaに書き込めるはず ただし、transmuteに&aを渡して&mutに変換するみたいなことをすると未定義動作になるから注意は必要 https://doc.rust-lang.org/reference/behavior-considered-undefined.html > Mutating immutable data. All data inside a const item is immutable. Moreover, all data reached through a shared reference or data
owned by an immutable binding is immutable, unless that data is contained within an UnsafeCell<U>. http://mevius.5ch.net/test/read.cgi/tech/1656285423/697
698: デフォルトの名無しさん [] 2022/09/11(日) 12:51:18.94 ID:6axTKkj4 >>693 >mutを付けずにletで宣言すると書き換わらない値として >書き込めないメモリ領域(例えば.textセクション)に配置されたりしないのか?というのが心配な点です しねーよ。 組み込みだろーがそれは変わらない。 letついて束縛変数といわれようが変数は変数。 http://mevius.5ch.net/test/read.cgi/tech/1656285423/698
699: デフォルトの名無しさん [sage] 2022/09/11(日) 13:08:43.20 ID:3JeGkSLy 今はしないけどそうなるような最適化は禁止されてないのでは http://mevius.5ch.net/test/read.cgi/tech/1656285423/699
700: デフォルトの名無しさん [sage] 2022/09/11(日) 13:49:03.04 ID:7UmicIsS コンパイル時に値が確定してないとtextセクションに書けないでしょ http://mevius.5ch.net/test/read.cgi/tech/1656285423/700
701: デフォルトの名無しさん [sage] 2022/09/11(日) 13:55:35.90 ID:VMVpvyTB そっちは定数でconstだしそうなる letはあくまでもimmutableな変数であり定数ではない http://mevius.5ch.net/test/read.cgi/tech/1656285423/701
702: デフォルトの名無しさん [sage] 2022/09/11(日) 13:57:25.52 ID:kEOVMHNm コンパイル時に確定するような式なら最適化でありえるんじゃないの? http://mevius.5ch.net/test/read.cgi/tech/1656285423/702
703: デフォルトの名無しさん [sage] 2022/09/11(日) 14:07:54.90 ID:VMVpvyTB どのように最適化されようが constではなくlet x = ...ならば let mut x = x; とムーブして書き換え可能 これは言語のレベルで保証される そしてそのように使うならば最適化も無駄なことせずにtext segmentでなくdata segmentに置くだろう http://mevius.5ch.net/test/read.cgi/tech/1656285423/703
704: デフォルトの名無しさん [sage] 2022/09/11(日) 14:40:44.81 ID:ujBIW69o CloneとCopyについて let mut bitmap:[u32; LEN] = [0; LEN]; let mut bitmap:[ARGB32; LEN] = unsafe {core::intrinsics::transmute::<[u32; LEN], [ARGB32; LEN]>(bitmap)}; と #[derive(Clone, Copy, Default)] & let mut bitmap:[ARGB32; 16] = [ARGB32::default(); LEN]; で読み書きを bitmap[0].red = 0x80; let x = bitmap[0].red; bitmap[0].green = x; としてみたけど出力された読み書き部分のコードは同じでした。もっとでかい構造体じゃないとムーブか
コピーかの区別は出来ないのかな >>696 マジか。Rustでもパディングの問題がつきまとうのか。でも >Accessing unaligned fields directly with e.g. packed.unaligned is safe however. って事は.redとかでアクセスする場合はコンパイラが良きに計らってくれるのでアクセス境界の問題は起きないって事かな? 画像データのバイトやビットの並びなんてすでに決まっていてプログラムはそれに合わせるしかないのが普通でしょうし 勝手にパディングされても困ります 実は並行してCでも書いているんだけど構造体のパディングの制御は処理系依存ら
しくて移植性を優先すると データは整数の配列で持って論理演算とシフトで分解、構築するコードになってしまってます http://mevius.5ch.net/test/read.cgi/tech/1656285423/704
705: デフォルトの名無しさん [sage] 2022/09/11(日) 14:49:25.24 ID:FOB38Q8d そのような実装はしたくないわけですか http://mevius.5ch.net/test/read.cgi/tech/1656285423/705
706: デフォルトの名無しさん [] 2022/09/11(日) 15:13:19.03 ID:/O1tQPyF どの言語でも同じ Rustでも&mutでtransmuteしてもendian依存は避けられないな let mut x = 0x01020304_u32; let a = unsafe { std::mem::transmute::<&mut u32, &mut [u8; 4]>(&mut x) }; a[1] = 7; assert_eq!(x, 0x01020704); とlittle endianでは7の位置はこうなる http://mevius.5ch.net/test/read.cgi/tech/1656285423/706
707: デフォルトの名無しさん [sage] 2022/09/11(日) 18:54:24.82 ID:gEyGQ7vE このスレでよく出てくる μt ってなんなん? 音的に mut をそう書いてる異常者がいるだけかと思ってるんだけど、なにか別の意味を持った概念や機能だったりするの? http://mevius.5ch.net/test/read.cgi/tech/1656285423/707
708: デフォルトの名無しさん [sage] 2022/09/11(日) 20:25:15.55 ID:FOB38Q8d 自分も思ったけどブラウザによっては & mut がそうなるみたい http://mevius.5ch.net/test/read.cgi/tech/1656285423/708
709: デフォルトの名無しさん [] 2022/09/11(日) 20:27:57.44 ID:QYXgEc7E >>708 そうなんだ。 http://mevius.5ch.net/test/read.cgi/tech/1656285423/709
710: デフォルトの名無しさん [sage] 2022/09/11(日) 20:45:42.63 ID:hnVgjqVb >>708 なるほど、ありがと。 異常者かと思って真面目に読む気が失せてたんだけど誤解だったか。 http://mevius.5ch.net/test/read.cgi/tech/1656285423/710
711: デフォルトの名無しさん [sage] 2022/09/11(日) 21:25:51.88 ID:zZ32ojSE HTMLの文字参照で& muがμ http://mevius.5ch.net/test/read.cgi/tech/1656285423/711
712: デフォルトの名無しさん [sage] 2022/09/11(日) 21:45:56.06 ID:ujBIW69o 例えば pixel.alpha = in[0].alpha; pixel.red = in[0].red / 2; pixel.green = in[0].green / 2; pixel.blue = in[0].blue / 2; out[0] = pixel; と red = 0xFF & (in[0] >> 16); green = 0xFF & (in[0] >> 8); blue = 0xFF & in[0]; red /= 2; green /= 2; blue /= 2; pixel = 0xFF000000 & in[0]; pixel |= red << 16; pixel |= green << 8; pixel |= blue; out[0] = pixel; ではだいぶ見やすさが違うような http://mevius.5ch.net/test/rea
d.cgi/tech/1656285423/712
713: デフォルトの名無しさん [sage] 2022/09/11(日) 21:47:41.04 ID:3JeGkSLy >>704 パディングというかメモリアクセス時のアラインメントについてはCPUの仕様だから言語関係ないよ x86がunalignedなアクセスについてゆるゆるだから忘れられがちだけど雑に書いたプログラムをarmで動かしたりするとクラッシュする 今回はu8へのアクセスだからさすがにパディング入れられることはないと思うけどね http://mevius.5ch.net/test/read.cgi/tech/1656285423/713
714: デフォルトの名無しさん [sage] 2022/09/11(日) 21:50:14.96 ID:3JeGkSLy >>712 シフト処理など隠蔽してくれるアクセサメソッド用意したらだいたい同じような読みやすさになるのでは http://mevius.5ch.net/test/read.cgi/tech/1656285423/714
715: デフォルトの名無しさん [sage] 2022/09/11(日) 23:45:21.14 ID:ujBIW69o Rust固有じゃないけど移植性を改善する方法に1バイトずつ処理するという手があるけどこの実装は、今時の32bitや64bit環境で 相応にデバフが入るんですよね。MSVCでも8bitロード×8を64bitロード×1に最適化してくれなかったし >>713 そこを抽象化するのが処理系の仕事では。いまだに構造体でパース・・・みたいなコードを見かけるし >>714 読みやすさは改善しても今度は速度にデバフが入るような。こういうケースでアクセサメソッドを利用したとして 全て
インライン展開&最適化されますかね?一つでもコールやブランチが残ったら速度が結構落ちるだろうし http://mevius.5ch.net/test/read.cgi/tech/1656285423/715
716: デフォルトの名無しさん [] 2022/09/11(日) 23:59:30.49 ID:/O1tQPyF >>707 色んなブラウザで見てみたけど &mut (分けて書くと & mut )が μt と表示されるのはバグってるchmateだけっぽい http://mevius.5ch.net/test/read.cgi/tech/1656285423/716
717: デフォルトの名無しさん [sage] 2022/09/12(月) 00:37:31.19 ID:5hhAOS+Q &mut テスト http://mevius.5ch.net/test/read.cgi/tech/1656285423/717
718: デフォルトの名無しさん [sage] 2022/09/12(月) 01:00:12.66 ID:JkhjRZ+U >>716 ほー、chmateはワザとunescapeしてるのか? 5chがUnicode文字表示できるようになったんだし、そういうのはもう余計なお世話だな http://mevius.5ch.net/test/read.cgi/tech/1656285423/718
719: デフォルトの名無しさん [] 2022/09/12(月) 01:13:39.26 ID:D0TZxDhn HTML等の文字参照を処理する場合でも μt (= & m u ; t )が μt となるのは正しいけど &mut (= & m u t )が μt となるの間違いだからこれはバグと思われる http://mevius.5ch.net/test/read.cgi/tech/1656285423/719
720: デフォルトの名無しさん [sage] 2022/09/12(月) 02:30:39.40 ID:JkhjRZ+U あ、たしかにバグっぽい・・・ http://mevius.5ch.net/test/read.cgi/tech/1656285423/720
721: デフォルトの名無しさん [sage] 2022/09/12(月) 06:45:23.29 ID:hsi1XO0i 文字列参照に & mut なんてないからテキトーに解釈してるんでしょ 良し悪しは別にして html を扱うブラウザではそれほど珍しくはない 個人的には余計な事すんなとは思う http://mevius.5ch.net/test/read.cgi/tech/1656285423/721
722: デフォルトの名無しさん [sage] 2022/09/12(月) 07:14:45.53 ID:tyJETXG8 これはmateのバグです & x y z ; とセミコロンで終わる場合のみその部分を文字参照として解釈するのが正しいです http://mevius.5ch.net/test/read.cgi/tech/1656285423/722
723: デフォルトの名無しさん [sage] 2022/09/12(月) 07:33:21.32 ID:o/NFQNbK &mut と書けば良いかな テスト → &mut http://mevius.5ch.net/test/read.cgi/tech/1656285423/723
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 279 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.021s