rust: Rustがんばろう 19日目
2025/08/03
'static
静的ライフタイムというものがある。
特殊なタイムライフ(の1つ?)で、'static
と表記する。
他の言語での書き方は分からないけど、これって C言語で言うところの static const
みたいな感じよね。
C++ だと const
はリンクで衝突しないからヘッダファイルに置いていても static
無しの const
だけでもいけるんじゃなかったっけ。
私の C++ って第3版止まりなのよね。
あの頃の情熱に比べると、確かに他の言語については熱意が見られない。。
それはともかく。
組み込みソフトウェアをやっていると特に意識するのだが、変数の初期値ってゼロ以外だとプログラム上に値を持っていないといけない。
初期値は、大ざっぱには ROM の領域に置くことになる。
そしてグローバル変数の初期値はプログラムの起動時の main()
が呼ばれる前に行われる。
CRT(C RunTime) とか呼ばれていた気がするが、グローバル変数は main()
より前に初期化しないといけないというルールがあるのでそうなっている。
メモリが少ない C言語系だと、初期値の設定をしないようにして削減したり、初期値のないグローバル変数をゼロにする処理を無しにしたりなどできたと思う。
幸い、私の仕事ではそこまで求められなかったので「そういうオプションもあったよなあ」くらいの記憶である。
ただ複雑な環境だと、参照していた ROM のアドレスは同じなのに物理的にアドレスバスが切り替えられる何てことも考えられる。
いやー、でもアドレス空間は広いから、そんな面倒なことをせずに全部マッピングしてもよさそうだ。
変なことすると変なバグが生まれやすいしね。
細かい話は良いとして、ゼロ以外の初期値がある変数というのはデータとして初期値を持っている、ということを言いたかっただけだ。
'static
はおおよそそういう感じのデータなのだろう。
ここでは文字列リテラルの話だけになっているが、変数のゼロ以外の初期値はすべてそうなっているはずだ。
ただ、ローカル変数の初期値くらいだとたぶん関数呼び出し時のスタック値初期化くらいなレベルで組み込まれていて'static
って感じではないと思う。
たぶんねー。