現象
以下の事例で説明します。
-
構造体、または Microsoft Visual Studio 2008 Service Pack 1 (SP1) 内のクラスからのバイトをロードするアプリケーションを作成するとします。
-
/Ox最適化オプションまたは/O2最適化オプションを有効にすると。
-
X64 のリリース構成を使用してアプリケーションをコンパイルするプラットフォームです。
このシナリオでは、構造体のメンバーまたはクラス メンバーにアクセスするために生成されるオフセットが正しくありません。
のみと構造体のサイズとオフセットまたはクラスのサイズとオフセットと等しい次のペアのいずれかのこの問題が発生します。
-
(14,13)
-
(15,13)
-
(22,21)
-
(23,21)
-
(30,29)
-
(31,29)
解決策
修正プログラムの情報
サポートされている修正プログラムはマイクロソフトから現在入手可能です。ただし、この資料に記載されている問題のみを修正するものです。この特定の問題が発生したシステムにのみ適用してください。この修正プログラムは、今後さらにテストを行うことがあります。この問題で深刻な影響を受けていない場合は、この修正プログラムが含まれる次の Visual Studio 2008 service pack のリリースを待つことを勧めします。
この問題を解決するには、修正プログラムを入手するのには、Microsoft カスタマー サポート サービスに問い合わせてください。マイクロソフト カスタマー サポート サービスの電話番号とサポートのコストに関する情報の一覧については、次のマイクロソフト Web サイトを参照してください。
http://support.microsoft.com/contactus/?ws=support注: 特別な場合では、まれに通常サポート コールの発生に料金 Microsoft Support 担当者は、特定の更新で問題が解決されると判断した。追加の質問および問題の特定のアップデートの対象にはなりませんが、通常のサポート料金が適用されます。
必要条件
Visual Studio 2008 Service Pack 1 インストールこの修正プログラムを適用する必要があります。
再起動の必要性
この修正プログラムの適用後にコンピュータを再起動する必要はありません。
修正プログラムの置き換えに関する情報
この修正プログラムによって他の修正プログラムが置き換わることはありません。
ファイル情報
修正プログラム (英語版) のファイル属性は次表のとおりです。ただし、これより新しい修正プログラムがリリースされている可能性もあります。各ファイルの日付および時刻は、世界協定時刻 (UTC) で示されています。ファイル情報に表示される時刻は、ローカル時刻に変換されています。UTC とローカル時刻との時差を確認するには、コントロール パネルの [日付と時刻] の [タイム ゾーン] タブを使用してください。
ファイル名 |
ファイル バージョン |
ファイルのサイズ |
日付 |
時刻 |
プラットフォーム |
---|---|---|---|---|---|
C2.dll |
15.0.30729。 4082 |
2,283,320 |
2009 年 3 月-19- |
05:13 |
x86 |
C2.dll |
15.0.30729.4082 |
2,36 1,656 |
2009 年 3 月-19- |
05:13 |
x86 |
C2.dll |
15.0.30729.4082 |
3,01 7,528 |
2009 年 3 月-19- |
05:13 |
x64 |
Link.exe |
9.0.30729.4082 |
1, 0 54,520 |
2009 年 3 月-19- |
05:13 |
x64 |
Link.exe |
9.0.30729.4082 |
799、032 |
19-Mar-2009 |
05:13 |
x86 |
回避策
この問題を回避するには、構造体または 8 バイトの倍数の最小クラスのサイズを拡張する 1 つまたは複数のダミーの"符号なし char"のメンバーを追加します。たとえば、16 バイトに 14 バイトを拡張します。
状況
マイクロソフトは、この問題を「対象製品」セクションに記載されているマイクロソフト製品の問題として認識しています。
詳細
ソフトウェア更新プログラムの用語の詳細については、次の文書番号をクリックして、マイクロソフト サポート技術情報の資料を参照してください。
824684マイクロソフトのソフトウェア更新プログラムを記述するために使用される一般的な用語説明
問題を再現する手順を実行します。
-
という Test.cpp Visual Studio 2008 sp1 では次のコードを使用してアプリケーションを作成します。
typedef struct DskDecimal
{
unsigned char precision;
unsigned char scaleFactor;
unsigned short value[ 5];
unsigned char maxPrecision;
unsigned char maxScaleFactor;
} DskDecimal;
int main()
{
DskDecimal decimal;
decimal.maxScaleFactor = 4;
DskDecimal self = decimal;
return self.maxScaleFactor;
} -
次のコマンドを使用してアプリケーションをコンパイルします。
cl test.cpp/O2/MD
期待される結果は、4 です。ただし、実際の結果は 0 です。