C++相談室 part166 (418レス)
上下前次1-新
1: sage (ワッチョイ 8732-NXaD) [] 2025/04/26(土) 10:34:58.41 ID:pbPDl6lv0(1/2) AAS
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること
次スレは>>980が立てること
無理なら細かく安価指定
※前スレ
C++相談室 part165
2chスレ:tech VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
394: デフォルトの名無しさん (ワッチョイ b1d6-xkro) [sage] 2025/06/20(金) 10:35:00.76 ID:YK1FsnCb0(1) AAS
最適化のロジックを作るのはまだプログラマーでしょうから。
値を10倍してから10で割るというプログラムを
何もしないに変更するのありかな。
でもわざと桁あふれをさせたい場合もある?!
395: デフォルトの名無しさん (ワッチョイ 0175-Is3k) [] 2025/06/20(金) 10:40:47.81 ID:BxPKXrVj0(2/4) AAS
昔は最適化でバグ混入させられることもあって、最適化は切れってされてたなぁ、っていうおっちゃんのつぶやき
396(2): デフォルトの名無しさん [sage] 2025/06/20(金) 10:45:39.27 ID:4xHX9xY70(1/2) AAS
>>392392(1): デフォルトの名無しさん (ワッチョイ 0175-Is3k) [] 2025/06/20(金) 09:01:01.71 ID:BxPKXrVj0(1/4) AAS
>>390
変数が関わらない定数だけの演算なら、コンパイルの時点で計算しても結果同じだよね
だから実行時ではなくコンパイルの時点で演算した結果を使う
初歩の最適化の一つ
元の式については左辺に変数が入ってくるから多分最適化はされない
a=b/10*10みたいなのを想定してると思うけど、この場合は最終的に
a=b/10
c=a*10と分解して計算されるので、どちらにも変数が関わってしまい最適化対象外だと思う
a=b*(10/10)みたいな、計算優先度的に変数が関わらないところができれば最適化される
この手の手動最適化なんて考えなくなって久しいから間違ってたらすまぬ
ここまでの話で「定数だけの演算なら」と何で言い出すのか理解できないけど
>>375では「整数型の変数を」と言っているわけだし
まあそれはおいておいても「コンパイルの時点で計算しても」←演算してんじゃんって俺は思うわけ
>>393それ自体は問題なくね?
157 を 10で割って15
これに10を掛けるのでなく15*8+15+2 でも最適化の影響はないだろ?
割り算の方でそれが起きるなら問題だけど、>>378の人の話では起きないようだけど
397: デフォルトの名無しさん (アウアウウー Sacd-xHx3) [sage] 2025/06/20(金) 11:14:53.80 ID:xCnXC/Iza(1/2) AAS
>>396
これ観たら発狂するんじゃね
外部リンク:qiita.com
外部リンク:qiita.com
外部リンク:qiita.com
398(1): デフォルトの名無しさん (ワッチョイ 0175-Is3k) [] 2025/06/20(金) 11:57:23.05 ID:BxPKXrVj0(3/4) AAS
>>396
コンパイラで演算しても結果が変わらない場合に限り、コンパイラで演算を行いその結果だけを使う
392でも書いてるが、例題の変数を10で割って10を掛ける動作は演算結果が変わってしまうので最適化は行わない
399: デフォルトの名無しさん (ワッチョイ 9279-fyaG) [sage] 2025/06/20(金) 12:39:35.73 ID:4fYw50h40(1) AAS
定数はいつ計算しても同じ結果なんだから最適化されるよ
400(1): デフォルトの名無しさん (ワッチョイ 59c9-LWzS) [] 2025/06/20(金) 12:50:40.34 ID:yZt3hnAQ0(1) AAS
-O3だとプログラムが動かなくなるから使っていいのは -O2までって先輩に言われてた
401: デフォルトの名無しさん (ラクッペペ MM96-gPPd) [sage] 2025/06/20(金) 12:53:23.61 ID:y+CeF2upM(1) AAS
何故最適化レベルをワザワザ選べるようにしているのか?
完璧なら選ぶ必要はない
理想論には興味ないから語りたいなら具体的な問題点を上げていけ
402: デフォルトの名無しさん (アウアウウー Sacd-xHx3) [] 2025/06/20(金) 13:06:46.75 ID:xCnXC/Iza(2/2) AAS
>>400
それは言われてたのは知ってるが
「-O3だとプログラムが動かなくなる」のは未定義踏んでるからじゃないか
403(1): デフォルトの名無しさん (ワッチョイ 6e9d-x4hs) [] 2025/06/20(金) 13:28:04.40 ID:H6JOW3Vp0(1) AAS
モバイルc消えてるんだけどなんで?
404: デフォルトの名無しさん (ワッチョイ e908-x4hs) [] 2025/06/20(金) 13:42:00.01 ID:JPiEW2yh0(1) AAS
>>403
あれ便利やった
なんで消されたんやろ
405: デフォルトの名無しさん (JP 0H46-E6Ax) [] 2025/06/20(金) 17:27:19.07 ID:yQfQLmUOH(1) AAS
std::formatの件だが、Visual Studio 2022のコンパイラ設定が
デフォルトでC++14標準になってた。すまん。
406(1): デフォルトの名無しさん [sage] 2025/06/20(金) 18:21:03.44 ID:4xHX9xY70(2/2) AAS
>>398
そんなことは知ってるのさ
「実行ごとに演算結果が変わる(可能性がある)」から最適化されない、と言うのは良いんだけど
最初からその前提の話をしていたはずなのに「演算をやらない可能性がある」と言い出しただろ?
375 整数型の変数を〜(略)〜この計算が最適化とかで除かれない保証ってあるの
381 それだと取り除けるケースがあるので保証はされない
382 いや、そんなことない。最適化では結果は変わらない事が保証される。
388 (略)〜演算をやらない可能性があるってこと
この流れじゃ『整数型の変数(実行時に結果が変わる)の場合でも最適化によって「演算をやらない可能性がある」』ってニュアンスになっているって気づかんの?
それに対してのどういう状況だ?という>>390だよ
まあ言いたいことは分かったから別にいいけどさ
407(1): デフォルトの名無しさん (オイコラミネオ MMdd-Rgxs) [sate] 2025/06/20(金) 19:12:09.11 ID:ykKOKnwYM(1/7) AAS
>>406
回答者にも正しいことを言っている人と間違っていることを言っている人が
いるというだけ。
正しいのは、仕様に明示されている動作については、
最適化してもしなくても結果が変わらないという事だ。
なぜなら、それが仕様なのだから。
408: はちみつ餃子◆8X2XSCHEME (ワッチョイ f532-iKku) [sage] 2025/06/20(金) 19:41:18.21 ID:3ZuChe0s0(1) AAS
>>407
大元の質問からすると仕様が動作を保証するか結果を保証するかをわかってないようだからその説明では不十分でしょ。
409(1): デフォルトの名無しさん (オイコラミネオ MMdd-Rgxs) [sage] 2025/06/20(金) 20:44:54.01 ID:ykKOKnwYM(2/7) AAS
保証されます。
410: デフォルトの名無しさん (ワッチョイ b235-m2eM) [] 2025/06/20(金) 21:00:28.00 ID:M1o0ztly0(1) AAS
コンパイル時に値が決まるようなら実行時に演算されない
そうでない場合でもある整数が決まった値になることが保証されていることがコンパイル時に分かっているなら最適化されて演算されないケースがある
それ以外なら最適化されない
411: デフォルトの名無しさん (オイコラミネオ MMdd-15C+) [sage] 2025/06/20(金) 21:06:32.84 ID:80Iion+LM(1/2) AAS
いずれにせよ結果を使わないなら最適化で丸々消される
412(1): デフォルトの名無しさん (ワッチョイ 0175-Is3k) [] 2025/06/20(金) 21:12:56.63 ID:BxPKXrVj0(4/4) AAS
>>409
ただしバグがなければ
413: デフォルトの名無しさん (オイコラミネオ MMdd-15C+) [sage] 2025/06/20(金) 21:18:29.51 ID:80Iion+LM(2/2) AAS
最適化の時点でコードが消されるので直に0で除算をするとコンパイルエラー
変数に突っ込んでるとコンパイル可能で実行してもその部分は最適化され消されてるのでゼロ除算にならない
もちろんconstにしててもコンパイルエラー
414: デフォルトの名無しさん (オイコラミネオ MMdd-Rgxs) [sage] 2025/06/20(金) 21:43:49.77 ID:ykKOKnwYM(3/7) AAS
>>412
それは、ユーザープログラムのバグではなく、コンパイラのバグだ。
コンパイラにバグが無ければ、四則演算や&,|,~,^,&&,||などと
括弧の組み合わせた結果は、最適化しても変わらない。
0除算に関しては話が別。
415(1): デフォルトの名無しさん (オイコラミネオ MMdd-Rgxs) [sage] 2025/06/20(金) 21:48:47.56 ID:ykKOKnwYM(4/7) AAS
最適化されて変わる可能性があるのは、今思い出せるのは、
・初期化してない変数の中身
・変数のアドレス
・結果を利用せず、副作用も伴わない式の存在。
整数に対する四則演算を含めた「計算」は、仕様が決められているので、
同じコンパイラと同じターゲット(OS、環境)だと最適化しても
結果は変わらない。
浮動小数点に対する計算は誤差の範囲で結果が変化する可能性はある。
416(2): デフォルトの名無しさん (オイコラミネオ MMdd-Rgxs) [sage] 2025/06/20(金) 22:25:10.37 ID:ykKOKnwYM(5/7) AAS
>>415
1. 整数の計算途中に「桁あふれ」が起きる場合はこの限りではないかも知れない。
例えば、整数型 a に対して、a * 100 / 5 は、a * 20 と最適化できる
可能性がある。しかし a がとても大きい場合には結果は同じにはならない可能性がある。このことに
関して仕様がどうなっているかは知らない。
2. 浮動小数点型の変数 a に対して、(a * 100.0) / 5.0 は、
a * 20.0 と最適化できる可能性があるが、浮動小数点型には計算誤差があるので、
誤差の範囲内で異なる結果になる可能性があるかもしれない。
これに対して仕様上、最適化していいかどうか走らない。
3. しかし、整数型
417: デフォルトの名無しさん (オイコラミネオ MMdd-Rgxs) [] 2025/06/20(金) 22:25:52.67 ID:ykKOKnwYM(6/7) AAS
>>416
3. しかし、整数型変数 a に対して、(a / 100) * 100 は、
明らかに
418: デフォルトの名無しさん (オイコラミネオ MMdd-Rgxs) [sage] 2025/06/20(金) 22:26:34.77 ID:ykKOKnwYM(7/7) AAS
>>416
3. しかし、整数型変数 a に対して、(a / 100) * 100 は、
明らかに a とは、結果が異なる。だから a と最適化される事は無い。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.015s