パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

アライメント揃ってなくても大丈夫だというのは思い込み?」記事へのコメント

  • by Anonymous Coward

    x86系って、SIMDを明示的に使わない限り、アライメント境界が揃っていないデータ転送プログラムを書いても、パフォーマンスさえ気にしなければ特に問題ないという認識でいた。

    SIMD使わなくても、アラインメント狂っていたら例外出されておかしくない。
    alignment-tolerant processorsの場合は速度低下だけだが、alignment-strict processorsの場合は、不正アラインメント例外だ。

    • by Anonymous Coward

      そんなことは承知の上でx86の話をしているというのに、トンチキな奴だな

      • by Anonymous Coward

        x86は比較的緩かったとは思うが何でもありなぐらいにフリーダムだったっけ?

        • by Yoh2 (6924) <yoh2@d2.dion.ne.jp> on 2013年02月02日 13時47分 (#2317873) 日記

          フリーダムだという保証があるのかフリーダムだと思い込んでいただけなのか、そこが問題なわけで。
          ロクに調べないうちに日記を書いたので、もう少し調べてからにした方がよかったかもしれませんが。
          といっても 、過去にvoid * と関数へのポインタ の相互変換を認める追加ルール (※) を探しても見付けられなかった程度の調査力なので、きちんと調べても調べ切れるかどうか。

          ※ C99以降 (それ以前は知らん) では、関数へのポインタは他の関数へのポインタへの変換以外は規定されていないので、追加ルールがないとvoid *との相互変換は未定義。そしてこれが未定義になるとdlsymの存在意義に関わってくるのでどこかで追加ルールを設定しているはず。

          しかし、もしアライメントが揃っていないアドレスへのアクセスがダメとの結果が出たら過去に書いたIPヘッダとかISO9660とかのパーサが……
          奇数アドレスからの複数バイトフィールドとか、4で割り切れないアドレスからの4バイトフィールドとかあるし。

          --
          巧妙に潜伏したバグは心霊現象と区別が付かない。
          親コメント
          • > 奇数アドレスからの複数バイトフィールドとか、4で割り切れないアドレスからの4バイトフィールド

            そういうのは、バイト単位でアクセスしてプログラムコード的にシフト等駆使して16bitなり32bitとの相互変換するのがまっとうなやり方でしょう。
            アライメント以前に、エンディアンはどうなってるの?と言う点で動作保証がないし。

            親コメント
            • by Yoh2 (6924) <yoh2@d2.dion.ne.jp> on 2013年02月02日 16時33分 (#2317943) 日記

              自分のところ(x86とppc)で動けばいいや、というプログラムの場合、アライメントを気にせず読み込んでhtonlなどでバイトオーダー調整なんぞやってたもんで。memcpyすらタイプを面倒がってました。

              --
              巧妙に潜伏したバグは心霊現象と区別が付かない。
              親コメント

UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie

処理中...