トップページ > プログラム > 2015年12月29日 > zasxVKJk

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

6 位/212 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000002102100006



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
536
547
C++相談室 part121 [無断転載禁止]©2ch.net

書き込みレス一覧

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?


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