タグ

!tumblr-techとalignmentに関するtyruのブックマーク (5)

  • アラインメントを気にしない読み出しを行う - 101回目のコンパイル

    仕事でARMアーキテクチャを使っているときにアラインメントをまたぐ読み出しを行ってプログラムが異常終了するケースがありました。 そのときは ARM gcc ¥Ð¥Ã¥É¥Î¥¦¥Ï¥¦½¸: ¥¢¥é¥¤¥ó¥á¥ó¥È に書いてあるようなバッドノウハウで切り抜けましたが、そもそもアラインメントを気にしない読み出しを行う関数があるといいのでは?と思い、読み出しを行うC++のテンプレート関数を書いてみました。 第一引数に読み出す領域の先頭ポインタを渡し、第二引数に読み出すメモリオーダリングを指定します。無駄にPDPエンディアンにも対応してます。f(^^;) 指定された領域からはテンプレート引数に渡した型のサイズ分を読み出し、指定されたメモリオーダリングで解釈された値を返します。 #include <stddef.h> #include <stdint.h> #include <endian.

    アラインメントを気にしない読み出しを行う - 101回目のコンパイル
  • malloc(3) でハマッタのでメモッタ。 - GONE WITH THE MEDICINE

    どもです。 オートミールをべ始めたせいか,便通がよろしいようで,快便ですたいっ! malloc(3) ではまる。 メモリ関連のコードを書いていて,テストを書いて,テストでこけた。 printf で原因を調べると,どうやらアラインメントの問題でこけているようだった。 あるサイズの倍数のアドレスで割り当ててるはずが,そうなってない。 自分で書いたコードには問題が見つからず。 というわけで,man malloc してみた。 一部抜粋。 For calloc() and malloc(), return a pointer to the allocated memory, which is suitably aligned for any kind of variable.どうやら,calloc(), malloc() ともに, いい具合にアラインメントを調整してくれるようだ。 何がいい具合か知

    malloc(3) でハマッタのでメモッタ。 - GONE WITH THE MEDICINE
    tyru
    tyru 2011/04/14
    > If you need a block whose address is a multiple of a higher power of two than that, use memalign, posix_memalign, or valloc.
  • 開発メモ: アラインメント問題とDebianパッケージ化

    考察 考察ってほどでもないが、個人的に興味深いと思う点を挙げておこう。第一に、少なくともi386だと、推奨アラインメントと構造体の最小オフセットが異なるということだ。オブジェクトのサイズと推奨アラインメントが同じになるのは直感的に理解できる(そうでないと配列がうまく扱えないから)が、構造体の中にメンバを配置する際には、推奨アラインメントよりも低いアラインメントでオブジェクトを詰めて配置することがあるということだ。つまり、i386では、8バイト幅であるlong longのオブジェクトを4の倍数のアドレスに配置しても正常に評価ができるということだ。理由はよくわからんが、メモリ使用量の節約のためとか後方互換性のためとかそんなところなのだろう。 第二に興味深いのは、i386だと、long doubleのサイズが12バイトで推奨アラインメントが4だということだ。doubleの推奨アラインメントは8な

  • 境界調整(アラインメント)を調べる::実装技術

    2005-08-14 組み込み開発では、しばしば型の境界調整への配慮が必要になってきます。ところが、境界調整の要求サイズは完全に処理系に依存しますし、境界調整を調べるための専用かつ標準的な機能もないのが現状です。 確かに境界調整を調べるための専用の機能はありませんが、既存かつ標準の機能の組み合わせで調べるための方法はあります。残念ながら、この方法はCとC++では異なるものになってしまいます。この辺りはCとC++の微妙な非互換性に起因しているのです。 まずはCの場合についてです。これは<stddef.h>で定義されているマクロoffsetofを使うことで実現できます。 #define alignof(type) offsetof(struct { char a; type b; }, b) char型と調べようとする型のフィールドからなる構造体を使って、調べようとする型のオフセットを調べれば

  • 未初期化な領域とアラインメント - Cry's Blog

    http://d.hatena.ne.jp/Cryolite/20051021#p1 の問題に対する解答. まず大前提として,未初期化な領域に配置構文 new を用いてオブジェクトを構築する手法は潜在的な危険が多く,当にそれが必要な場合以外は用いないという方針が基であることを確認しておいてください. まず最初に自動変数として(スタック上に)確保した char の配列に任意のオブジェクトを構築する場合についてです. class MyClass { ..... }; int main() { char buf[sizeof(MyClass)]; MyClass *p = static_cast<MyClass *>(static_cast<void *>(buf)); ::new (p) MyClass(); ..... // #1 p->~MyClass(); }上のコードはアラインメン

    未初期化な領域とアラインメント - Cry's Blog
  • 1