bssセクション初期化の必要性
概要
最近バイナリサイズ削減や高速化について試行錯誤しているのだが、そこでふと疑問に思った。bssセクションの初期化(0クリア)はスタートアップルーチンで当たり前のように行われているが、これは必ずしも必要なものなのだろうか。今回はこれについて調べてみる。
bssセクションとは
初期値を持たない変数を格納する場所である。これには0で初期化された変数も含まれる。
初期化の必要性
C言語には「bssセクションはすべて0で初期化されなければならない」という規定がある。多くのスタートアップルーチンでbssセクションの0クリアが行われているのはこのためである。
実際はシステム依存
しかしながら、実際にはスタートアップルーチンで0クリアが行われないケースも存在する。これは処理の高速化を図る際に、最初に0クリアを行うのは処理速度的に非効率である場合があるからである。このような場合は、最初に0クリアは行わず、変数が必要になった際に0で初期化されることが多い。
結論
bssセクションは原則スタートアップルーチンで0クリアされる。しかし、高速化の観点からこれは省略されることもある。