スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


このエントリーをはてなブックマークに追加

ARM系CPUのアライメントに注意せよ!(EXC_ARM_DA_ALIGN対策)

以前VC++で開発したWindows用のC++ライブラリをiOS用に移植していたところ、実行時に思わぬ落とし穴が!
Releaseコンパイル時のみEXC_BAD_ACCESSの例外が出てクラッシュする。

memcpyで例外が発生したのだが、慎重に調査しても、確保した領域が足りないとか、コピー先のアドレスが間違っているということはなさそう。そこで、デバッガをGDBからLLDBに切り替えて実行してみると、エラーの内容が変わった!

EXC_ARM_DA_ALIGN

この単語からアライメントのエラーであることが分かる。色々調べた結果、次のようなページを発見!

Recap: EXC_ARM_DA_ALIGN and memory alignment errors on iPhone OS 3.2 and later

英語なのであまり読んでいないけど(笑)どうやら、

typedef struct {
CGPoint position;
float direction;
float speed;
} BallInfo;

- (void)receiveData:(NSData *)data fromPeer:(NSString *)peer
inSession:(GKSession *)session context:(void *)context
{
BallInfo b = *(BallInfo*)[data bytes]; // <<< exception here
// do something with 'b'
...
}

というコードではバイト境界をまたぐ参照で例外が発生するので、次のように、一度変数bにコピーしてから参照する必要があるらしい。

typedef struct {
CGPoint position;
float direction;
float speed;
} BallInfo;

- (void)receiveData:(NSData *)data fromPeer:(NSString *)peer
inSession:(GKSession *)session context:(void *)context
{
BallInfo b;
memcpy(&b, [data bytes], sizeof(b));
// do something with 'b'
...
}

おそらく、x86系CPUではバイト境界をまたぐ読み書きに寛容なので、内部で上のコードと似たようなことが行われているのだろう。対して、ARM系であるiPhone実機ではそれが許容されない、ということかな。(間違ってたらすみません)

ちなみに、私も同様の対策で解決できることを確認した。しかし、全てのコードがアライメントを完全に考慮できていると思えなかったので、#pragma packを使って強制的にアライメントを1バイトに変更して対応した。

#pragma pack(push,1)

typedef struct {
CGPoint position;
float direction;
float speed;
} BallInfo;

#pragma pack(pop)

これでアライメントを気にしなくてよくなるが、当然動作は遅くなる。

ところで、C言語経験が長いプログラマーでも、アライメント関連について勘違いをしている人は意外と多い。私も結構怪しいので調べていたら、めちゃくちゃ詳しく説明している日本語サイトを発見!(↓)
データ型のアラインメントとは何か,なぜ必要なのか?

このサイトでもう少し勉強してみようと思う。

このエントリーをはてなブックマークに追加

テーマ : プログラミング
ジャンル : コンピュータ

コメント

非公開コメント

iPhoneアプリ紹介
パズルナビ for パズドラ 2016
最強のコンボツール!
colorization-large-icon.png

スクリーンショットを読み込むとコンボを自動計算してくれるパズドラの攻略アプリです。


AirRuler
(簡易距離計)

リモートで簡単に距離を測定できるアプリ!
colorization-large-icon.png

目標地点に向けてiPhoneを傾けるだけで簡単に距離を測定できます。ゴルフの距離測定機能付きパターの代わりにも使えます。


補色残像アート
~見えない色が見えてくる~
白黒なのにカラーに見えてしまう不思議な映像を体験しよう!
colorization-large-icon.png

補色残像という目の錯覚を利用して、白黒写真がカラーに見える不思議な映像を作成できます。作成した映像は、アニメGIFに変換したり、Twitterに投稿することもできます。


タイピング革命
フリック練習はタイピング革命で!ネットランキングで盛り上がろう!
icon-l-typing.jpg

オンラインランキング上のプレイを閲覧できるリプレイ機能付き!フリック入力とローマ字入力に完全対応したタイピング練習アプリです。初心者も安心のトレーニングモード付き。

★なんと!あのAppBank様に紹介して頂きました!!
typing-sale-led.gif


簡単3Dカメラ
iPhoneで手軽に3D写真を楽しもう!平行法/交差法/アナグリフ/グラグラ3Dに対応。
icon-l-3d.jpg

2枚の写真を撮影するだけで、裸眼で立体視できる3D写真が作成できます。85円でステレオ写真もアナグリフも楽しめるのは簡単3Dカメラだけ!

プロフィール

あらきんぐ☆

Author:あらきんぐ☆
はじめまして。あらきんぐです。
4月からiPhoneを購入し、その魅力に取り付かれて、気がついたらアプリ開発の道へ!仕事でプログラム開発をしていますが、基本「動けばOK!」な適当エンジニアです。適当でもアプリは作れる!っていう事を、ブログを通じて証明していきたと思います。

最新記事
最新コメント
最新トラックバック
カテゴリ
FC2カウンター
全記事表示リンク

全ての記事を表示する

Twitter
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
アクセスランキング
[ジャンルランキング]
コンピュータ
309位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
31位
アクセスランキングを見る>>
オススメ商品
iPhone/iPodと一般オーディオを繋ぐ貴重なアイテム!
アプライドオリジナルアイテム MBB...

アプライドオリジナルアイテム MBB...
価格:3,980円(税込、送料別)

開発中級者にオススメ!「こんなことができるんだ!」と驚かされる一冊
【送料無料】iPhone...

【送料無料】iPhone...
価格:1,500円(税込、送料別)

安い!シンプル!カッコいい!
希少なiPhone対応キーボード内蔵ケース
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。