- ベストアンサー
binファイルの軽量化についての変数への代入処理
- binファイルの軽量化には、変数への代入方法が影響を与えます。
- 直接一つずつ代入する方法と、変数の定義時に代入する方法があります。
- どちらの方法が有効か、また、他に有効な処理方法があるかについて学びましょう。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
ファイルサイズを小さくしたいのなら 初期化したいデータの規則性などにもよりますがバイト単位で定数ならmemsetを使い、バイト単位以外(intとかlongとか)ならループかと思います。
その他の回答 (4)
- Gotthold
- ベストアンサー率47% (396/832)
初期化でないならmemsetもありかもしれない。
お礼
ありがとうございます。 記載し忘れており、申し訳なかったのですが、 実は今回は不規則なデータの代入なので、memsetは使用できませんでした。 しかし、大きな領域の0初期化はmemsetの方が良さそうなんですね。 試してみます。
- ki073
- ベストアンサー率77% (491/634)
多分一番よいのは forループを作って、その中で配列dataに0x00を順番に書き込んでいくことだと思います。 バイナリの大きさと速度ともに有利なはずです。 バイナリの大きさと速度は共存しにくいので、それぞれコンパイル時のオプションで対応します。 質問欄のソースコードからすると速度を速くしたいということのように感じますので、それを前提に回答します。 forループで書くと、今時のコンパイラだと主にループの部分を最適化しようとします。 高速化の基本はベクトル化とunrollです。 gccはちょっと分かりませんが、市販のコンパイラだとまずベクトル化をしようとします。 intelCPUの場合はSSEを使って、16バイトまたは32バイト単位で一度に処理できますので、高速に処理できます。 また必要によってはunroll処理をします。 ループの形で書くとコンパイラが最適化しやすいので、速度で有利になります。 質問欄にある(1)はunroll処理を全部やった場合です。古めのソースコードで高速化の手段で見られますが、コンパイラのとってベクトル化の判断が難しいため、手動unrollだけになってしまうはずです。 (2)の場合は、ベクトル化もunrollも可能なのですが、初期値を書き込んだところからコピーするか(読み込む必要があるのでメモリアクセルが増える)、さらに最適化されてもループの場合と同じなので、わざわざそうする理由はないと思います。 まあこの程度の初期化の場合1回だけしか実行されませんので、どれにしても誤差内だと思いますが。
お礼
ありがとうございます。 最適化に関しては普段あまり意識しておらず、要勉強です。 今回はファイルサイズ減が第一でしたが、実は速度も気にしなければならないため、 お返事いただいた内容を取っ掛かりに学習をしたいと思います。 アセンブラレベルでどういった表記になるのか、考えながらコードを組まないといけませんね。
- notnot
- ベストアンサー率47% (4900/10359)
auto変数の初期値を設定するのであれば、原理的には(1)の方が良くなることはありません(同じか悪い)。実際には最適化でまったく同じコードになるでしょう。 static変数やグローバル変数であれば、(2)の方が速くて短いです。実行時に代入されないので。 初期化でないのならそもそも(2)は使えないので、比較の意味がありません。 defineはコンパイル前の処理なので実行とは全く無関係です。 速度を気にするのはまずプログラミングの基本を理解してからで十分です。
お礼
ありがとうございます。 defineで定義すると、グローバル変数での初期化程リソースを食わずに データを保持できますね。 あまり大きな値は管理が面倒かもしれませんが、どうにか。。
- wormhole
- ベストアンサー率28% (1626/5665)
バイナリファイルが軽くなるというのはどういう事でしょうか? ファイルサイズが小さくなることですか? 実行速度が速くなることですか? それとも、それ以外のことでしょうか
補足
誤解されやすい文章でした。 ファイルサイズを小さくする方です。 実行速度が早いに越した事はないですが、 (1)ファイルサイズ小 (2)実行速度 (3)可読性 の順位付けとなります。
お礼
ありがとうございます。 実行ファイルサイズ減の効果としても、forループの方が良いのですね。 当然for文を使用した方がコードを書く際にも便利なので、安心しました。