アカウント名:
パスワード:
モバイルギア(WindowsCE機)のアプリケーションを開発していたときに、C のソースで構造体を使ったら何をやってもハードウェア例外発生。MIPS ではデータ配置が 4バイトとの倍数というルールを知らなかった。けっきょくダミーバイトを埋め込んで解決したけど、未熟だったなあ。構造体の配置 [microsoft.com]
未熟だったのはコンパイラでは?構造体のパディングとかの環境依存な処理はコンパイラの仕事です。
x86とMSVC6PP5辺りでの事だけど、構造体のメンバに__m128な変数を定義した場合、その__m128な変数は16バイト境界に合わない場合が有ったような気がするする。__declspec(align(16))とはいったい...。
関係あるかわかりませんが、古いABIのMSVC++でvtableとアライメント要求のきついメンバがあると、非効率的なパッキングが行われるのは結構イライラしました。
http://lolengine.net/blog/2012/10/21/the-stolen-bytes [lolengine.net]
それを具体的にどう処理するかは未定義なんじゃないの?
6.7.2.1/12 読んでから言え
(構造体を正しく動作するように処理する限りにおいては)具体的にどのようにパディングしてもC言語の仕様を満たす。
仕様は満たしてるけどトラップ発生するんでしょ。
構造体を正しく動作するように処理する限りにおいては)
を満たしてないからダメでしょ。
構造体を未定義な使い方してただけじゃね。バイト配列を何も考えずに構造体にキャストしたとか
「4バイトとの倍数というルール」ではなくて、"自然な" アドレスにメンバを配置。リンク先にもそう書いてあるけど..って
intおよびlong(32ビット) 32 バイト境界上に配置。float 32 バイト境界上に配置。double 64 バイト境界上に配置。
だと? 富豪的プログラミングにもほどがあるだろ。
x86では奇数バイトにすら配置できるけど遅いよ。ある意味それこそ富豪的プログラミング
その場合でも2箇所読む程度ですよね。32ビット変数を32バイト毎に配置したら、バースト転送も何も無に帰するんじゃないですかね?Typoとは思うけど。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
クラックを法規制強化で止められると思ってる奴は頭がおかしい -- あるアレゲ人
MIPS CPU (スコア:2)
モバイルギア(WindowsCE機)のアプリケーションを
開発していたときに、C のソースで構造体を使ったら
何をやってもハードウェア例外発生。
MIPS ではデータ配置が 4バイトとの倍数というルールを知らなかった。
けっきょくダミーバイトを埋め込んで解決したけど、未熟だったなあ。
構造体の配置 [microsoft.com]
Re: (スコア:0)
未熟だったのはコンパイラでは?
構造体のパディングとかの環境依存な処理はコンパイラの仕事です。
Re:MIPS CPU (スコア:2)
x86とMSVC6PP5辺りでの事だけど、構造体のメンバに__m128な変数を定義した場合、その__m128な変数は16バイト境界に合わない場合が有ったような気がするする。
__declspec(align(16))とはいったい...。
Re: (スコア:0)
関係あるかわかりませんが、古いABIのMSVC++でvtableとアライメント要求のきついメンバがあると、非効率的なパッキングが行われるのは結構イライラしました。
http://lolengine.net/blog/2012/10/21/the-stolen-bytes [lolengine.net]
Re: (スコア:0)
それを具体的にどう処理するかは未定義なんじゃないの?
Re: (スコア:0)
6.7.2.1/12 読んでから言え
Re: (スコア:0)
(構造体を正しく動作するように処理する限りにおいては)具体的にどのようにパディングしてもC言語の仕様を満たす。
Re: (スコア:0)
仕様は満たしてるけどトラップ発生するんでしょ。
Re: (スコア:0)
を満たしてないからダメでしょ。
Re: (スコア:0)
構造体を未定義な使い方してただけじゃね。
バイト配列を何も考えずに構造体にキャストしたとか
Re: (スコア:0)
「4バイトとの倍数というルール」ではなくて、"自然な" アドレスにメンバを配置。
リンク先にもそう書いてあるけど..って
intおよびlong(32ビット) 32 バイト境界上に配置。
float 32 バイト境界上に配置。
double 64 バイト境界上に配置。
だと? 富豪的プログラミングにもほどがあるだろ。
Re: (スコア:0)
x86では奇数バイトにすら配置できるけど遅いよ。ある意味それこそ富豪的プログラミング
Re: (スコア:0)
その場合でも2箇所読む程度ですよね。
32ビット変数を32バイト毎に配置したら、バースト転送も何も無に帰するんじゃないですかね?
Typoとは思うけど。