- C++相談室 part121 [無断転載禁止]©2ch.net
536 :デフォルトの名無しさん[sage]:2015/12/29(火) 15:08:32.55 ID:zasxVKJk - >> -O3付きで最適化したら評価がループ前の一回になった
手元の環境だと再現しないからコンパイラのバージョン教えて欲すぃ >>534 が言うように puts を call してるから static でないグローバル変数について 最適化がかかるとは考えづらいんだけど
|
- C++相談室 part121 [無断転載禁止]©2ch.net
537 :536[sage]:2015/12/29(火) 15:10:58.33 ID:zasxVKJk - 阿呆な勘違いをしてた
グローバル変数じゃないよね…
|
- C++相談室 part121 [無断転載禁止]©2ch.net
542 :デフォルトの名無しさん[sage]:2015/12/29(火) 16:20:44.57 ID:zasxVKJk - 翻訳単位外で vec() を↓みたく定義して -flto でコンパイルするとうまいこといくけどー
#include <cstdlib> #include <vector> std::vector<int> vec() { return std::vector<int>(rand()); } スレッド云々は関係ないとしても、ループ内で size() と puts() しか呼んでないんだから これくらいの最適化くらいはして欲しい気が
|
- C++相談室 part121 [無断転載禁止]©2ch.net
544 :デフォルトの名無しさん[sage]:2015/12/29(火) 18:10:39.31 ID:zasxVKJk - > 運よく定数にできる
まったくその通りだと思うけど、>>533- で言われてるみたいに 最適化が阻害されてるのはなんで?
|
- C++相談室 part121 [無断転載禁止]©2ch.net
547 :デフォルトの名無しさん[sage]:2015/12/29(火) 18:29:22.06 ID:zasxVKJk - >>545
うん、うえのコードだと、size(void) は条件を満たしてるよね puts(const char*) もそうだと思うんだけど、 実際には size() をインライン展開したものがループ内にあるじゃん (>>533 って要するに (vec.end() - vec.begin()) / sizeof(T) ってことだよね?) なんでこれがループ外に追い出されないのかなって >>546 定数の char ポインタとスタック中に置かれたオブジェクトのメンバとの間で aliasing が起きうるとコンパイラが仮定してるってこと? 納得できるようなできないような…… 定数文字列をどこに置くかはリンカが決めることだから コンパイラとしては aliasing の可能性を否定できない、とか?
|
- C++相談室 part121 [無断転載禁止]©2ch.net
549 :547[sage]:2015/12/29(火) 19:03:15.94 ID:zasxVKJk - >>548
むむむ 今の場合は値返しだから関係ないじゃんと思ったけど、 (1) vector は普通ポインタを保持してて、そのポインタが unique であることをコンパイラは仮定できない (2) コンパイラは puts が何をするのか全く知らない。もしかしたら (1) のポインタがグローバルに置いてあって それを使って何かしているかも知れない(とコンパイラは考えざるを得ない) という理解でおk?
|