【初心者歓迎】C/C++室 Ver.63【環境依存OK】

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2009/02/08(日) 11:03:26
どんな end が来るかはコンパイラには 100 か 10 かも判らん場合が多いから
展開前をコメントアウトし、ばらしたコードで記述する意味はある。
953デフォルトの名無しさん:2009/02/08(日) 11:33:14
endが4の倍数なら後段のforも要らないしな
そこまでカツカツの速度が要る場面も珍しいだろうけど
954デフォルトの名無しさん:2009/02/08(日) 11:51:07
ループの中に if文が挟まって毎回評価してるのを
大加算ループの中でswitch に置き換えるとか色々。
955デフォルトの名無しさん:2009/02/08(日) 14:17:18
>>949
展開ってそういうことか
ありがとう。
それは4段階展開ってことだよね
確かに読みにくくなるね・・・
956デフォルトの名無しさん:2009/02/08(日) 14:20:12
アンロールするかどうかのコンパイルオプションがあることもあるよ
957デフォルトの名無しさん:2009/02/08(日) 15:09:17
手作業でアンロールを始めるとvtuneが欲しくなるな。
958デフォルトの名無しさん:2009/02/08(日) 15:53:05
VSにはアンロールなんて無くね?
959デフォルトの名無しさん:2009/02/08(日) 16:05:35
iccなら>952のendをヒントとしてコンパイラに与えることもできる。
960デフォルトの名無しさん:2009/02/08(日) 16:18:10
アンロールってはじめてしった
961デフォルトの名無しさん:2009/02/08(日) 16:23:52
>>949
 for (i = 0; i < end + 4 ; i += 4){
ですな・・
962デフォルトの名無しさん:2009/02/08(日) 16:26:51
それじゃ台無しだ。
963デフォルトの名無しさん:2009/02/08(日) 16:30:00
>>961
 for (i = 0; i < end − 4 ; i += 4){
にはw
964デフォルトの名無しさん:2009/02/08(日) 16:54:39
whileの展開はどうなるの?
でも制御文事態のコストがforより軽いからやる意味ないのかな?
965デフォルトの名無しさん:2009/02/08(日) 19:01:04
whileでも同じ
966デフォルトの名無しさん:2009/02/08(日) 19:03:42
展開可能な文を while に詰め込むのは クソプログラム だと思うがね。
967デフォルトの名無しさん:2009/02/08(日) 20:20:39
アンロールもいいけどチョコロールもね
968デフォルトの名無しさん:2009/02/08(日) 20:50:10
>>966
???
969デフォルトの名無しさん:2009/02/08(日) 21:24:19
>>968

do と while どういう使い分けしてるの?
970デフォルトの名無しさん:2009/02/08(日) 22:07:06
>>969
???
971デフォルトの名無しさん:2009/02/08(日) 23:21:09
数値を変更もしないし、わかりやすく別名を付ける場合は
const int MAXDATA = 123;
#define MAXDATA 123
この2つはどっちが正しいんでしょうか?
なにか決定的な違いはありますか?どうでもいいですか?
972デフォルトの名無しさん:2009/02/08(日) 23:23:15
Cでは後者。

C++ではどちらも正しいが、前者が望ましい。
名前空間やスコープを無視するマクロはできるだけ無い方が良い。
973デフォルトの名無しさん:2009/02/09(月) 00:44:57
どうしても、処理が遅い場合、最後の手段はアセンブラを書きなおすっていうのをやってみたいんですが、
アセンブラの命令一覧はなにを参考にすればいいんですか?どこにあるんでしょうか?
CPUによってかわるんですか?
974デフォルトの名無しさん:2009/02/09(月) 00:47:56
>>973
命令一覧みたからって即できるようなもんじゃないとだけ言っておく
975デフォルトの名無しさん:2009/02/09(月) 00:59:41
アセンブラはマイコンで慣れてるのでたぶんできると思います。
物によって命令が違うのでWindowsで使える?VSで使える命令を知りたいんです
976デフォルトの名無しさん:2009/02/09(月) 01:08:42
>>975
ほぼ確実に遅くなるからやめておいたほうがいい。
パイプラインを阻害しないような命令配置とか人間が考えるよりコンパイラにやらせたほうがマシ。
SSEとか使うなら今のところコンパイラまかせよりは人間のほうがいいかも知れんけど。
977デフォルトの名無しさん:2009/02/09(月) 01:09:02
Windowsと言えば、x86だからIntelのウェブサイトにPDFが転がっている。まあAMDにもあるだろうけど。
http://www.intel.co.jp/jp/download/

この中でも、命令が載っているのは
32ビット(と16ビット)はIA-32 インテル
アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル。
上・中A・中B・下があって中2つが命令一覧。

大体同じだけど、64ビットがインテル エクステンデッド・メモリー 64
テクノロジー・ソフトウェア・デベロッパーズ・ガイドの1巻・2巻。

適当にググって予備知識を付けてから見たほうがいい気もするけど。
978デフォルトの名無しさん:2009/02/09(月) 01:12:49
>>973
とりあえずこのへん?
http://www.icnet.ne.jp/~nsystem/simd_tobira/index.html

独学でなんとかなんのかぁ?
MMXですら俺は誰かに教わらないと無理だった
しかも全然速くなんねーw
979デフォルトの名無しさん:2009/02/09(月) 01:14:09
命令だけ見てもダメじゃん。
Cの変数とやりとりする規約をコンパイラのマニュアルから探さないと。
980デフォルトの名無しさん:2009/02/09(月) 01:18:59
>>979
そんなのサンプルみて体で感じ取るぐらいじゃないと駄目
981デフォルトの名無しさん:2009/02/09(月) 01:25:08
if( a == b && a == c )
これは問題ないですか?
if( (a == b) && (a == c) )
こう書かないと結果がおかしくなる場合ってあるんですか?
あと、&&と書きさえすればショートサーキットになるんでしょうか?
コンパイラによって変わってきちゃいますか?VSなんですが
982デフォルトの名無しさん:2009/02/09(月) 01:27:49
インテルで調べればよかったんですね。
Windowsはハードの互換性がメリットだと思ったので
仮想アセンブラのようなものでCPUを統一しているのかと思いました。
ありがとうございました。
983デフォルトの名無しさん:2009/02/09(月) 01:29:16
>>982
> 仮想アセンブラのようなものでCPUを統一
うまいなあ。それは.NET Frameworkというやつだ。
984デフォルトの名無しさん:2009/02/09(月) 01:29:40
規約や引数その他はコンパイラにアセンブラの出力をさせりゃそれで充分。
問題は、
玄人のアセンブラ>>コンパイラの最適化>>>>素人のアセンブラ
なことだ。

確かIntelのpdf群の中に最適化マニュアルもあっただろ。
どんな命令がストールを起こすとかマイクロコードだから遅いとか
互換性を維持しながら最大限速度を取るにはとか、そんなのが載ってるはず。たぶん。

ただね、SIMDのような特殊な命令を利用して特定部分を、というのでない限り
普通は「分岐予測ミス」「メモリアクセス」によって、CPU時間のかなりの部分を食われるのよ。
Pen4とかと比べれば、最近のはそれでもマシになったけど、おそらく半分程度は浪費されるはず。
だから、いかに分岐を減らしてキャッシュミスを無くすか
そういうのをC/C++のレベルで考えながらコードを書いたほうが意味があったりするわけよ。
985デフォルトの名無しさん:2009/02/09(月) 01:45:31
ほう。今ならコンパイラの最適化が人間が扱うのは無理なレベルに達してると思ってたんだが、
玄人ががんばれば勝てるものなのか。
986デフォルトの名無しさん:2009/02/09(月) 02:05:11
>>985
コンパイラに勝つには、コンパイラの使わないSIMD命令を使い倒さないとだめだな。
でも、ほどほどの速さで良ければ、アセンブリ言語を使わなくても
コンパイラ組込関数を使えばいいという状況になりつつある。
987デフォルトの名無しさん:2009/02/09(月) 04:04:01
マルチスレッドで変数を同時にアクセスするのが危険な気がするので確実に安全をつくりたいんですが
ここからここまでの処理はこのスレッドに変数アクセス優先権をあたえて、
他のスレッドがアクセスしに来たらそのスレッドは変数を使い終わるまでそこでストップ
というような処理はできるんでしょうか?
988デフォルトの名無しさん:2009/02/09(月) 04:05:58
できるよ。一度に、あるコードに入れる回数を制限できる
989デフォルトの名無しさん:2009/02/09(月) 04:21:10
http://ameblo.jp/cpp-prg/

ここのミューテックスにサンプルのってる
990デフォルトの名無しさん:2009/02/09(月) 06:00:00
難し・・・がんばる
ありがとう!
991デフォルトの名無しさん:2009/02/09(月) 07:02:28
>>981
前者で全く問題ない
992デフォルトの名無しさん:2009/02/09(月) 07:12:43
マルチスレッドで変数のアクセスって
書き換えがメインスレッドだけでサブスレッドは
読み込みだけだったら問題ないですか?
993デフォルトの名無しさん:2009/02/09(月) 07:25:55
中途半端な状態ってのがないならそれでいいけど、
volatile はつけとけよ。
994デフォルトの名無しさん :2009/02/09(月) 09:06:55
まるで初心者だが、borlandC++5.5を使ってて、
Windows関数をつかって軽いアプリケーションを作りたいのだが
win関数を使うとコンパイルでエラーが出てしまう・・・
"外部シンボル 'WinMain' が未解決"
これはどういうことなのでしょうか・・・?おしえてくだしあ><
995デフォルトの名無しさん:2009/02/09(月) 09:11:03
"外部シンボル 'WinMain' が未解決"
でぐぐれ
996デフォルトの名無しさん:2009/02/09(月) 09:11:16
-W をつける。
997デフォルトの名無しさん:2009/02/09(月) 11:25:14
>>985
> ほう。今ならコンパイラの最適化が人間が扱うのは無理なレベルに達してると思ってたんだが、
> 玄人ががんばれば勝てるものなのか。

勝てるけどコストが合わない事が多い。
998デフォルトの名無しさん:2009/02/09(月) 12:37:45
>>993
volatile じゃ解決しねーよ。同期オブジェクト使わないと。
999デフォルトの名無しさん:2009/02/09(月) 14:19:14
んなこたぁない状況による
1000デフォルトの名無しさん:2009/02/09(月) 14:34:16
どこくらいの移植性を考えるかで変わってくるな。
メモリモデルをx86系Windowsに限定するならセーフ。
C/C++の言語的にはアウト。
専門的な話をしたいならマルチスレッドスレに行ったほうがいい。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。