- C++相談室 part121 [無断転載禁止]©2ch.net
530 :デフォルトの名無しさん[sage]:2015/12/29(火) 12:53:18.17 ID:TUTY/6iG - 一般には、その他にもmutableなメンバ変数があったりすると毎回呼ぶ必要が出るね。
std::vectorの場合に限ると、-O2付けた出力はこんな感じになったよ。 https://gist.github.com/pixie-grasper/150777a10d70f0abbbf7 評価されるどころか、vectorクラスのprivateメンバから値持ってくる感じのコードに最適化されるっぽい。
|
- C++相談室 part121 [無断転載禁止]©2ch.net
531 :デフォルトの名無しさん[sage]:2015/12/29(火) 13:26:27.57 ID:TUTY/6iG - ちなみにうちの環境だと、該当箇所は
/usr/include/c++/4.8/bits/stl_vector.h:642-646 // [23.2.4.2] capacity /** Returns the number of elements in the %vector. */ size_type size() const _GLIBCXX_NOEXCEPT { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); } こんな具合。 あと、_M_implはvectorから見てprotectedだったわ。
|
- 2進数や16進数を覚える意味がわからない [無断転載禁止]©2ch.net
66 :デフォルトの名無しさん[sage]:2015/12/29(火) 13:30:15.79 ID:TUTY/6iG - >>65
楔形文字としては随分単純な方だよ。 言語圏によっては楔形文字自体が数百通りあって、 漢字みたいにそれぞれ意味が違うなんて事にもなってたらしい。
|
- 【初心者歓迎】C/C++室 Ver.97【環境依存OK】 [転載禁止]©2ch.net
230 :デフォルトの名無しさん[sage]:2015/12/29(火) 13:34:33.37 ID:TUTY/6iG - >>227
perfect forwarding(完全転送)という名の完全でも転送でも無いstd::forwardを正しく使うくらい朝飯前だろ?
|
- C++相談室 part121 [無断転載禁止]©2ch.net
533 :デフォルトの名無しさん[sage]:2015/12/29(火) 14:28:50.16 ID:TUTY/6iG - >>532
いや、汗を見る限りじゃ毎回評価されてる。 ループ部分を抽出するとこうなるんだけど、[rsp+8]と[rsp+16]にpointer型の vectorから参照可能なbeginみたいな奴とendみたいな奴が入ってて、引き算したりとか右シフトしたりとかしてsize()の値を計算してる。 .LBB0_4: movl $.L.str, %edi callq puts incq %rbx movq 8(%rsp), %rdi movq 16(%rsp), %rax subq %rdi, %rax sarq $2, %rax cmpq %rax, %rbx jb .LBB0_4 詳細は>>530
|
- C++相談室 part121 [無断転載禁止]©2ch.net
535 :デフォルトの名無しさん[sage]:2015/12/29(火) 14:40:40.47 ID:TUTY/6iG - -O3付きで最適化したら評価がループ前の一回になった(clang, gccどちらでも)。
でもif (*it == 0) {l.pop_back();}みたいな事をループに含めたら ループ中にしっかり判定するように戻った。 最適化の理屈はわかるが理解は出来そうもないな。
|
- C++相談室 part121 [無断転載禁止]©2ch.net
538 :デフォルトの名無しさん[sage]:2015/12/29(火) 15:14:35.21 ID:TUTY/6iG - >>536
ごめん、もう一回確認したらどっちも毎度評価されてた。 間違って(auto i = 0ul; i < l.size(); i++)の代わりに(auto it = l.begin(); it != l.end(); ++it)のコード眺めてたらしい。 本当にごめんよ。 ちなみにバージョンの方はこんな具合 $ clang --version clang version 3.7.0 (tags/RELEASE_370/final 251906) Target: x86_64-unknown-linux-gnu Thread model: posix $ gcc --version gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4 Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
- C++相談室 part121 [無断転載禁止]©2ch.net
539 :デフォルトの名無しさん[sage]:2015/12/29(火) 15:24:15.64 ID:TUTY/6iG - 但し、最適化を妨げる為に
auto l = vec(); として、std::vector<int> vec();は宣言のみにした。 多分vec関数の中でスレッドを生成して別スレッドでベクタのサイズが変わるような例が 最適化を妨げてるんだと思う。 ので、試しに static auto vec(int l) { std::vector<int> ret(l); for (auto i = 0ul; i < ret.size(); i++) { ret[i] = rand(); } return ret; } して auto l = vec(argc); して試してみたら、-O2でl.size()が1度だけ呼ばれるようになった。
|
- C++相談室 part121 [無断転載禁止]©2ch.net
540 :デフォルトの名無しさん[sage]:2015/12/29(火) 15:37:43.90 ID:TUTY/6iG - コンパイラさん、スレッド作って内部で書き換えるなんて用途にはatomicなvectorを作って対応するので
もっと賢く最適化してください・・・・・・ 色々弄った結果、どうも宣言だけの関数の戻り値には最適化が効きにくいみたい。 まさかコンパイラが1つのファイルに全てを詰め込むスタイルを推奨してたとは。
|