トップページ > プログラム > 2015年10月26日 > YRFGsT3p

書き込み順位&時間帯一覧

4 位/146 ID中時間01234567891011121314151617181920212223Total
書き込み数0100000031110000000000007



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
C++相談室 part120 [転載禁止]©2ch.net
C言語なら俺に聞け(入門編)Part 130 [転載禁止]©2ch.net

書き込みレス一覧

C++相談室 part120 [転載禁止]©2ch.net
68 :デフォルトの名無しさん[sage]:2015/10/26(月) 01:40:29.63 ID:YRFGsT3p
>>67
そんな解読困難なコードが「いい」というような感覚は早く捨てるがいい。
C言語なら俺に聞け(入門編)Part 130 [転載禁止]©2ch.net
540 :デフォルトの名無しさん[sage]:2015/10/26(月) 08:06:17.85 ID:YRFGsT3p
>>537
> a=0; が clr にコンパイルされて read-modified-write になる例もある
それは困るな。
どのコンパイラの話?

http://www.jamsat.or.jp/scope/hitech/68k1.txt
> コンパイラは volatile と宣言されたオブジェクトにゼロを書くのに 68000 の CLR 命令を使いません。
ここらへんの仕様がちょっと調べて確認できるのはこのコンパイラだけだったけど、
コンパイラ屋さんもバカではないだろうから、こういう配慮があるもんじゃないかな。


べつにドヤ顔してるつもりはないよ。
バイト単位でアクセスするレジスタの例を知ってるなら出してくれればいいのでは?
・・・あ、 8bit アーキテクチャなら普通な気がするんだけど、そういう話?
C言語なら俺に聞け(入門編)Part 130 [転載禁止]©2ch.net
542 :デフォルトの名無しさん[sage]:2015/10/26(月) 08:33:24.48 ID:YRFGsT3p
>>541
そう言われればそうか。
使ったことあるCPUのマニュアル見直したら普通にあったわ。

>532 の「殆どの場合はバイト単位のアクセスで問題ない」ってのはさすがに
おかしいだろう思って逆に極端なことを言っちゃったみたい。
ごめんよ。
C言語なら俺に聞け(入門編)Part 130 [転載禁止]©2ch.net
543 :デフォルトの名無しさん[sage]:2015/10/26(月) 08:36:34.42 ID:YRFGsT3p
>>538
これもよく見るんだけど、 C の aliasing rule 違反なんだよね。
最適化でどうなるかわかったもんじゃない。
C言語なら俺に聞け(入門編)Part 130 [転載禁止]©2ch.net
545 :デフォルトの名無しさん[sage]:2015/10/26(月) 09:20:45.67 ID:YRFGsT3p
>>544
ありがとう。
・・・これは、"HI-UX" でちょっと調べても仕様は確認できないね。
C言語なら俺に聞け(入門編)Part 130 [転載禁止]©2ch.net
547 :デフォルトの名無しさん[sage]:2015/10/26(月) 10:27:20.81 ID:YRFGsT3p
>>546
union のメンバのうち最後に書き込まれたもの以外のメンバを読むと未定義動作になる。
少なくとも規格の範囲内では。
使うならコンパイラごとの追加仕様に頼ることになる。

gcc だと >538 の例で sfr. としてのアクセスは拡張機能として認められるけど、
char* sfr_byte = &sfr.byte;
bit_field* sfr_bits = &sfr.bits;
こうしてしまうと sfr_byte, sfr_bits を通した相互のアクセス結果は保証されなくなる。
https://gcc.gnu.org/bugs/#casting_and_optimization
> To fix the code above, you can use a union instead of a cast (note that this is a GCC extension which might not work with other compilers):
C言語なら俺に聞け(入門編)Part 130 [転載禁止]©2ch.net
550 :デフォルトの名無しさん[sage]:2015/10/26(月) 11:04:27.77 ID:YRFGsT3p
>>548
未定義動作ならなんでもアリだよ?

・・・と、少し調べなおしたところ C99 以降の C では挙動が(実装依存にはなるけど)定まるようになってるみたい。
https://stackoverflow.com/questions/19511391/type-punning-vs-union-member-access
これなら、整数の表現形式やビットフィールドの格納方法が変わらない限り結果は変わらない。
最適化でそこが変わる可能性があるかどうか知りたければ、コンパイラの仕様を確認すればいい。

未定義動作になるのは C++ の話ね。スレ違いごめん。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。