26/07/05 18:57:33.56 WPNSOFOr0.net
初歩的な質問だけど、
関数の中の変数を、staticにしたら処理速度が上がりますか?
1億回呼んだときとか
int foobar() {
static int abc;
...
}
716:デフォルトの名無しさん
26/07/05 19:15:05.78 mGbnQmHn0.net
>>715
まず自分で測るくせつけろ
で納得いかないなら質問しろ
717:デフォルトの名無しさん
26/07/05 21:52:47.97 TFD+PKzm0.net
>>715
static int abc; と int abc; の違いはなんだと思われますか。
718:デフォルトの名無しさん
26/07/05 22:35:57.12 KCDpstWo0.net
思われますかじゃねーよまず>>716だよ
719:デフォルトの名無しさん
26/07/05 22:39:48.18 KCDpstWo0.net
>>715
C++の前のCのさらに大古からこういう処理速度がうんたらかんたら言う初心者相手に言われ続けてることだけど
お前が相手にしてんのはコンパイラであって電卓じゃねーんだけどそれは分かってんのか?
720:デフォルトの名無しさん
26/07/06 03:36:18.53 QBaP6jQ30.net
多分測り方も分からないようなレベルじゃないか?
そのレベルで速度云々気にするのは早すぎるというのもあるが。
721:デフォルトの名無しさん
26/07/06 05:00:12.77 uDVRvcz70.net
計測して仮にたまたま高速だったとして
何となくつけといたら高速になるから
つけとくかみたいな使い方のstaticはなかなか怖い
722:デフォルトの名無しさん
26/07/06 05:59:12.99 SfYRq1ZW0.net
そもそも静的ローカル変数の挙動を知らないと思う。
URLリンク(ja.cppreference.com)
明確な目的が無ければ安易に使うものじゃない。
723:はちみつ餃子
26/07/06 10:54:56.21 8wQ+qABd0.net
>>715
結論から言えば場合による。
static にすれば速くなるというわけでも遅くなるというわけでもなく、前後の状況や色々な要素が絡み合う。
現代的な CPU はレジスタの数を増やして、コンパイラは変数を上手くレジスタに割り当てることでメモリアクセスを減らすというのが高速化に寄与してる。
static にして寿命を延ばすとレジスタ割り当てできなくて (メモリアクセスが発生して) 処理速度が下がる方向の違いが生まれるといった可能性も考えられる。
static が無意味だとオプティマイザが看破して差がなくなるかもしれないし、具体的にどうなるかはやってみないとわからない。
完成して実測したときにそこが深刻なボトルネックになっていることがわかるまでは要らんことを考えるな。
「早すぎる最適化は諸悪の根源」「実測せよ」は半世紀以上前から繰り返し繰り返し繰り返し語られる格言なのは理由がある。
724:デフォルトの名無しさん
26/07/06 11:18:01.22 N2eJwA250.net
>>723
> 「早すぎる最適化は諸悪の根源」「実測せよ」は半世紀以上前から繰り返し繰り返し繰り返し語られる格言なのは理由がある。
全部動いてからの最適化は簡単。構築中の最適化は無意味 と学びましたね。リファクタリングも含めて。
その裏で、普通に当たり前に作れば別に遅くなる事もない も周知でした。
725:デフォルトの名無しさん
26/07/06 11:27:53.65 fGFB0KtK0.net
今どきのstatic変数はマルチスレッド化したのにthread_localつけ忘れてクラッシュしてダンプ解析で気づくまでが遠足
726:デフォルトの名無しさん
26/07/06 12:41:30.14 i04GTG5S0.net
処理系依存だろうし*.asm吐き出して読めばいいじゃんよ
727:713
26/07/06 13:26:48.70 /Eh7XToA0.net
>>723
ありがとうございます
たしかに、状況によりますね
コンパイラによっても、速くなったり遅くなったりって書かれていましたが
スタックメモリ割り当て時のオーバーヘッドとか、あまり気にする必要もないですね…
昔はregister intとかあったけど…
あと、グローバル変数はオーバーヘッドがありますね…
728:デフォルトの名無しさん
26/07/06 13:33:23.80 QBaP6jQ30.net
はい解散
729:デフォルトの名無しさん
26/07/06 20:27:42.59 zCg7yzST0.net
スタックメモリの割り当てコストなんてあるの?
スタックポインタの位置が数バイト変わるだけでしょ
730:デフォルトの名無しさん
26/07/07 02:06:57.75 6U2QhyBt0.net
float e = .00359;
最初の0がないこれって正しいコード?
printfで表示させるとちゃんと0.003590ってなるんだけど
731:デフォルトの名無しさん
26/07/07 02:15:19.12 8jEiN4Kb0.net
省略できるよ
flexで表すと
floating_type1 [0-9]+\.[0-9]*
floating_type2 [0-9]*\.[0-9]+
floating_type3 [0-9]*\.[0-9]*[eE][\+\-][0-9]+
floating {floating_type1}|{floating_type2}|{floating_type3}
この3系統
732:デフォルトの名無しさん
26/07/07 02:25:55.23 6U2QhyBt0.net
省略してもいいんだ
どうも
733:はちみつ餃子
26/07/07 12:51:54.10 Ix7CZHVP0.net
念のため根拠
URLリンク(timsong-cpp.github.io)
734:デフォルトの名無しさん
26/07/08 10:47:02.89 bfko0YT4F.net
>>729
>スタックメモリ割り当て時のオーバーヘッド
mainが呼ばれる前に終わってるんじゃないの
735:デフォルトの名無しさん
26/07/08 12:24:17.98 tr5fCEJz0.net
mainが呼ばれる前だけじゃなく、スレッド生成時にもスタックメモリーの割り当てコストは発生する
いずれにしても関数呼び出しの都度発生するものではないね