- C++相談室 part120 [転載禁止]©2ch.net
306 :デフォルトの名無しさん[sage]:2015/11/01(日) 01:21:38.45 ID:v/vxYa9c - 最適化の話題は誤解と罠が蔓延する混沌(ケイオス)ェ、
やっぱ人類はちょう進化したコンパイラの最適化に滅ぼされる運命なんや…!
|
- C++相談室 part120 [転載禁止]©2ch.net
326 :デフォルトの名無しさん[sage]:2015/11/01(日) 12:43:17.09 ID:v/vxYa9c - >>314
>Windowsだと排他制御はEnterCriticalsection これはスゲー安パイではあるがライトキューとリードキューの「両方が」空になるまで待たされるので 数百(運悪くキャッシュのrefillが併発したら数千)クロックサイクルレベルの待ちが生じる という具合で せっかくのアウトオブオーダー実行がご破算になる、 ご破算になるのだ…!
|
- C++相談室 part120 [転載禁止]©2ch.net
329 :デフォルトの名無しさん[sage]:2015/11/01(日) 13:57:28.81 ID:v/vxYa9c - void Foo::const_method() const {
const_cast<Foo*>(this)->not_a_const_method(); } みたいな?
|
- C++相談室 part120 [転載禁止]©2ch.net
331 :デフォルトの名無しさん[sage]:2015/11/01(日) 14:06:59.71 ID:v/vxYa9c - >>328>>330
普通に外せるわけだが、 const int a = 9999; void foo(const int* p) { *const_cast<int*>(p) = 1000; } int main() { foo(&a); } ビルドは通るからコンパイラを騙せてゐる 多分推測だけど、言語仕様上は処理系依存か未定義動作か何かになっていると思う
|
- C++相談室 part120 [転載禁止]©2ch.net
332 :デフォルトの名無しさん[sage]:2015/11/01(日) 14:09:48.06 ID:v/vxYa9c - 、const属性な領域への書き込みに関しては
|
- C++相談室 part120 [転載禁止]©2ch.net
338 :デフォルトの名無しさん[sage]:2015/11/01(日) 14:49:51.90 ID:v/vxYa9c - >>332
混沌(ケイオス)かく始まりき、 >>331のfoo()が外部リンケージの関数だったとき、コンパイラにできることが本当にあるか冷静になって考えてみよう…
|
- C++相談室 part120 [転載禁止]©2ch.net
339 :デフォルトの名無しさん[sage]:2015/11/01(日) 14:51:35.06 ID:v/vxYa9c - ちな、今の流れはちょう賢いコンパイラではなくて現用のやつ前提
>>336 ビルドは通った、と書いたが?
|
- C++相談室 part120 [転載禁止]©2ch.net
340 :デフォルトの名無しさん[sage]:2015/11/01(日) 14:54:17.76 ID:v/vxYa9c - アンカミスった、>>338のは>>333へのレスorz
|
- C++相談室 part120 [転載禁止]©2ch.net
344 :デフォルトの名無しさん[sage]:2015/11/01(日) 15:27:30.12 ID:v/vxYa9c - >>341
スマン、 >>342 >>331のは、コンパイラにばれているのはconst qualifierを外したいというプログラマの意向がばれているだけであって、 ガチでconst領域(書き込みがfaultになるようなセグメントとか、ROMとか)に書こうとしているのか否かはばれておらず、 したがって、foo()の呼び出し元がaがconstであることに依存した最適化を行った (aをROM領域に配置した、aの参照箇所を定数として展開した、etc.)のとは無関係に foo()は正当なコードで有り得る。 んまー>>320の言ってることは誤りだが(foo()の呼び出し元でconst前提の最適化は為され得る >>331のfoo()が削除されるというのは言い杉
|
- C++相談室 part120 [転載禁止]©2ch.net
349 :デフォルトの名無しさん[sage]:2015/11/01(日) 22:13:58.67 ID:v/vxYa9c - >>345
ちょっインライン展開で関数実体としてのfoo()が消えることと >未定義動作だからコンパイラによって関数呼び出し自体削除されても文句言えない (>333) の当否は関係ない話なんですが…(前者が真偽どちらであろうとも>333の主張に影響が無い しかも言語仕様上はinline展開される関数のアドレスを取ることは合法、つまり実体としてのfoo()は常に存在するから inline展開されたらfoo()が消える、という主張はその意味でも誤り ※ 最終的なexeからシンボルfoo()が消えるのはコンパイラではなくてリンカが不要と判断したときだけ んで、外部リンケージの関数の中身まで見るようなコンパイラは想定していませんよ、ということは>>339で表明してるし、 つまり>>345は全部誤り 混沌(ケイオス)かく始まりき…
|