トップページ > プログラム > 2015年12月29日 > TUTY/6iG

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

2 位/212 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000001323000000009



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
C++相談室 part121 [無断転載禁止]©2ch.net
2進数や16進数を覚える意味がわからない [無断転載禁止]©2ch.net
【初心者歓迎】C/C++室 Ver.97【環境依存OK】 [転載禁止]©2ch.net

書き込みレス一覧

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つのファイルに全てを詰め込むスタイルを推奨してたとは。


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