アカウント名:
パスワード:
signed→算術unsigned→論理
だが、確かにローテートがないのはとても困る時があるしCらしくもない。
ローテート使いたきゃレジスタ変数にしておいてインラインアセンブリを使う。あるいはルーチンごとアセンブラ化する。ローテート使わなきゃ実現できないって、速度効率しか理由が無いと思うがCPUにその命令がなきゃ効率が上がらないんですから
でも、CPUの実行コードが想像できるような言語でなければ速くできないという「神話」はまだまだ健在ですね。単純にC/C++以外のコンパイラにはそれほど金が掛けられていないだけなのか、現在のコンピュータはまだ抽象度の高い言語を人間様ほど賢く最適化できないためなのかは知りませんが。
AND1回?
ここにぶら下げ。
キャリーフラグを直接扱えないのが不便でかないません。
ローテートに関しては、680x系と80系で対応する命令の有無の問題もあるから、結果的にライブラリに逃げるんじゃないかな?
#680xはキャリーを含めた9bitでしかローテートシフトできないんですよ。#まあ、不便たらありゃしないw
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
物事のやり方は一つではない -- Perlな人
論理ローテートがない (スコア:0)
ローテートしたいだけなのに、
シフト2回 + AND1回 + OR1回
に分解しなきゃならん・・・
Re:論理ローテートがない (スコア:1)
signed→算術
unsigned→論理
だが、確かにローテートがないのはとても困る時があるしCらしくもない。
Re: (スコア:0)
Re: (スコア:0)
頭のいいコンパイラなら2べき定数で割るとちゃんと符号拡張つき(算術)シフト命令にしてくれる。
効率が問題なら、コンパイルされたコードを確認しておくこと。
Cこんぱいらってのは、こう使うんだよ。
#見なけりゃ良かった、というコンパイラも時々あるけど
Re: (スコア:0)
Re: (スコア:0)
ローテート使いたきゃレジスタ変数にしておいてインラインアセンブリを使う。
あるいはルーチンごとアセンブラ化する。
ローテート使わなきゃ実現できないって、速度効率しか理由が無いと思うが
CPUにその命令がなきゃ効率が上がらないんですから
Re:論理ローテートがない (スコア:1, 参考になる)
アセンブラで書けば速くなるなんていうのは、
ヘタでも手間をかければ必ず料理が美味しくなる
というのと同じくらい間違ってる。
マイクロソフトのCコンパイラに関して言えば、
インライン・アセンブラを使うよりも、intrinsicなローテート関数を呼んだほうが、
速いコードを生成してくれますから、ローテートのために1行でもアセンブラを使うのは、無駄です。
--
デバッグ・ビルドだと律義に関数を呼び出すので、恐ろしく遅くなるので、
デバッグ・ビルドのために#ifdefで、シフトを組み合わせたマクロに置き換えるという間抜けなことも必要ですが。
Re: (スコア:0)
でも、CPUの実行コードが想像できるような言語でなければ速くできないという「神話」はまだまだ健在ですね。
単純にC/C++以外のコンパイラにはそれほど金が掛けられていないだけなのか、現在のコンピュータはまだ抽象度の高い言語を人間様ほど賢く最適化できないためなのかは知りませんが。
Re: (スコア:0)
速度面で見た場合、組み込み関数は握り寿司ロボットみたいな印象があります。
職人が握った寿司は口に入れた瞬間に解れるような工夫がされています。
私はPentiumPro以降のOoOなCPUの実力を限界まで引き出したプログラムを見たことがありません。
イミフな命令列みたいなのはありましたが。
Re: (スコア:0)
コンパイラの実装にも依るのですが、
たとえば、
・インラインアセンブラで書かれた部分の前後に跨がって最適化を行わない
・インラインアセンブラで書かれた部分に対して最適化を行わない
・通常のコードとインラインアセンブラで書かれたコードに跨がっての最適化を行わない
といったような制限がある一方、
・組込関数を使って書かれた部分の前後に跨がって最適化を行う
・組込関数を使って書かれた部分に対して最適化を行う
・通常のコードと組込関数を使って書かれたコードに跨がっての最適化を行う
となっている実装が
Re: (スコア:0)
そこまで気にするならインラインアセンブラがいいと思っていま(す|した)。
組み込み関数版に負けるコードは、レジスタのコピーによる依存関係で余計な時間が掛かっていそうな気がします。
この部分まで考慮するとインラインアセンブラは組み込み関数と同等以上の速度になりますが
(極端な話、コンパイラが吐いたコードをインライン化すれば同等になるので)、
保持する値が多くなるとこれをが考えるのが大変で、かつ人間が並べるメリットも少なくなるので、組み込み関数で
Re: (スコア:0)
AND1回?
キャリーフラグがない(Re:論理ローテートがない) (スコア:0)
ここにぶら下げ。
キャリーフラグを直接扱えないのが不便でかないません。
ローテートに関しては、680x系と80系で対応する命令の有無の問題もあるから、結果的にライブラリに逃げるんじゃないかな?
#680xはキャリーを含めた9bitでしかローテートシフトできないんですよ。
#まあ、不便たらありゃしないw