2

cppのビットフィールド機能を使いたいです。
しかし、私はあらゆる種類の奇妙な動作を取得し
、コンパイラを制限する方法があるかどうか疑問に思っていました.

このビットフィールドを使用したい:

class MyBitField
{
   uint32 a :  8;
   uint32 b : 32;
   uint32 c : 32;
}

このコードを使用して:

uint8 rawData[9] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xFF, 0xFF};
MyBitField \*pMyBitField = (MyBitField\*)rawData;

(リトル エンディアンの 32 ビット CPU で) pMyBitField の a のフィールドは
0x12、pMyBitField
の b のフィールドは 0x9A785634、pMyBitField の a のフィールドは
0xFFFFDEBC になると予想します。

コンパイラは、説明のつかないアラインメントを行うことを選択します。
ビットフィールド内で異なるタイプを使用すると、アライメントが得られる可能性があることはわかっていますが、そうではありません。
どうすればできますか?

Visual Studio 2005 に焦点を当てましょうが、他の環境サポートも同様に祝福されます。

*パッキングの投稿をいくつか読みましたが、アライメントの問題は変わりませんでした。

ありがとう!

4

1 に答える 1

2

あなたのコードがコンパイルされないことを期待しています。 rawData配列型を持っています。これは暗黙的にポインターに変換されますが、暗黙的または明示的にクラス型に変換することはできません。

残りの部分については、コンパイラがビット フィールドをどのようにレイアウトするかは実装によって定義されますが、あなたの場合は無関係であると予想されます。32 ビット マシンでは、通常、32 ビット ビット フィールドはコンパイラに次のワードを強制的に使用させるため、最初のビット フィールドだけが影響します。コンパイラによっては、コンパイラが上位 8 ビットまたは下位 8 ビットのいずれかに値を配置するようにします (残りの単語は未定義のままにします)。

外部フォーマットに一致させる必要がある場合、これを確実に行う唯一の方法は、バイト単位で、そのバイトに必要な値を挿入することです。

于 2012-05-21T08:11:53.527 に答える