Android Platform 関連メモ

http://pdk.android.com/online-pdk/guide/index.html

こんなのに興味がある人向け。Android での C/C++ プログラミングの注意点。

Anrdoid の C++ での new は new(std::nothrow) 相当

  • bionic の libstdc++ で new の実装を確認する
    • bionic/libstdc++/src/new.cpp
  • mallocで実装されており、メモリ不足の場合は例外ではなく NULL が返る。NULL チェックがロジックとしては必須
    • ただし Linux ではメモリオーバーコミットの問題があるので、NULL が返らなかったからといってメモリが確保される保証はない
    • プログラマとしてはどうしようもないが "be a good citizen" で、みんなでメモリをガバガバ使う書き方はやめることで予防できる

除算(/, %)を画像処理などタイトループでは使わない

  • ARM には整数割り算の命令がない。libgcc で代替の関数が呼ばれるため遅い
  • 呼び出しの頻度で設計方針を分ける必要がある
    • 例えばユーザーイベントで駆動する部分で除算を使うのは問題ないが、ピクセル単位の処理で使うのは問題
  • 固定小数点で設計している場合は、nで割るのではなく、1/nを積算する、といったアプローチも可能

浮動小数点演算(double, float)はタイトループでは使わない

  • デフォルトでは soft-float なので遅い。固定小数点演算 > ソフト割り込みでの浮動小数点ユニット > ソフトウエアによる浮動小数点演算の順だと思われる。

メモリアラインメントに気をつける

  • ARM v6 からは unaligned data access でアラインメントエラーでいきなりアボートすることはないがそれでもペナルティはある
  • 幅の小さいポインタから、幅の大きいポインタへの reinterpret_cast 相当のキャストは気をつける必要がある
    • キャストは「ハードウエアの特性も踏まえて、プログラマが正しく動作することを保証します」という宣言でもある
    • キャストがないプログラムについて、アラインメントエラーが発生しないことはコンパイラが保証する
    • キャストした場合は、アラインメントエラーが発生しないことはプログラマが保証すべき

ハードウエアでゼロ割りは発生しない

  • ソフトウエアでの検出が必要

思い出したら追加