2016-03-24 14 views
3

MSVC用に書かれたC++コードをGCCまたはClang上で実行できるように変換しようとしています。UNALIGNED MSVC固有のコードを移植可能なC++コードに変換しますか?

問題のキーワードは

UNALIGNED

pDataををLPCBYTE

コードの例があるされている。

INT8 some8Value = *(UNALIGNED INT8 *)&(pData[offset]); 

INT64 some64Value = *(UNALIGNED INT64 *)&(pData[offset]); 

私は私が何を論理的に理解して考えますこのc odeは、pData + offsetを指すポインタから1バイトを読み込みたいとします。

もう1つは、pData +オフセットポインタから8バイトを読み込むことです。

混乱する部分は、なぜ最初のものが不一致なのかです。私は1バイトの読みが常に整列していると思った。

どういうわけかコードを誤解していますか?

は、次のこれを行うのクロスプラットフォームな方法です:その後、

INT8 part1 = pData[offset]; 
INT8 part2 = pData[offset + 1]; 
... 

そして、INT64の場合には(例えば)8部を結合しますか?

+0

8個の個々のオクテット( 'pData'は' INT8 * 'と仮定します)を読み込み、適切なビット操作でINT64にアセンブルしていますか?もしそうなら、正しく実行すればうまく動作し、移植可能ですが、 'UINT8'を使用します。あなたが気をつけなければならないのはサインビットにシフトしているだけです。正しいことをするのは難しいことです。とにかく、これは何箇所ですか? – WhozCraig

+0

@WhozCraig pDataはLPCBYTEです。2番目の部分では、この8バイト整数を構成できるコードをどのように記述するかを提案しようとしています。私はここで助けを探しています、もし私の方法が間違っているなら、私はそれをやるでしょうか? – halivingston

+0

私はFrankieの答え、btwと同意します。あなたは、これをハードウェアに置くつもりはないと仮定すると、データが整列していないことに悩まされます。インテルはそれについてかなり寛容になるかもしれません。ビッグブルーは*ではありません。 Sparcもそうではありません。 – WhozCraig

答えて

2

これは、Itaniumプロセッサ用にコンパイルする場合は__unalignedに、他のすべてのCPUではコンパイル時には0に等しいマクロです。 MSDN(https://msdn.microsoft.com/en-us/library/ms177389.aspx @)から :

あなたは__unaligned修飾子とポインタを宣言すると、コンパイラ が整列されていないそのポインタのアドレスデータを前提としています。 したがって、Itaniumプロセッサ ファミリ(IPF)コンピュータを対象とするアプリケーションでは、コンパイラは アライメントされていないデータを1バイトずつ読み取るコードを生成します。あなたのケースでは

単にヘッダに何にもそれを相当:あなたが好きな場合は、コード内の各場所からそれを削除し、

#define UNALIGNED 

か。

EDIT:ARMプロセッサに特異的に__attribute__ ((__packed__))ように、アラインされていないデータのためのGCCのためのそのexistoを指定する修飾子__packedを使用することができるが、MSVC存在しません。後者の場合、唯一の選択肢は#pragma pack(1)ですが、構造に限定する必要があります。
さらに詳しい情報はVisual C++ equivalent of GCC's __attribute__ ((__packed__))です。

+0

私は実際にこのコードはARMのWindows 10上で実行されるため、また、アンアラインドアクセスが失敗する可能性のあるLinux ARMに加えて、尋ねています...明らかに、一部のLinuxディストリビューションでは、 どのような状況でもコードを変換する方法に答えることができれば、それは素晴らしいでしょう – halivingston

+0

この修飾子はItaniumプロセッサフ​​ァミリに固有のものです。他のすべてのプロセッサASAIKでは、アクセス命令を修飾する必要はありません。 ARMプロセッサでは、INT8命令へのアクセス宣言は、バイト整列データの命令を生成するのに十分です。 –

関連する問題