キャストについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
コダック

キャストについて

#1

投稿記事 by コダック » 4ヶ月前

DirectX12の勉強で左から右へ流れる沢山の三角形を描画し、そのタイムスタンプの取得するサンプルを読み解いているのですが、途中のキャストの理解が及ばず数日ほど止まっています。

コード:

 
 const UINT resultBufferSize = resultCount * sizeof(UINT64);
 //CreateCommittedResourceでresultBufferSizeの大きさでm_timestampResultBuffer紐づけ
 
 D3D12_RANGE readRange = {};
 readRange.Begin = 2 * oldestFrameIndex * sizeof(UINT64); 
 readRange.End = readRange.Begin + 2 * sizeof(UINT64);
 void* pData = nullptr;
 m_timestampResultBuffers->Map(0, &readRange, &pData);
 const UINT64* pTimestamps = reinterpret_cast<UINT64*>(static_cast<UINT8*>(pData) + readRange.Begin); 

64bit環境です。
UINT → unsigned int
readRange.BeginはSIZE_T型→ULONG_PTR→unsigned __int64
UINT8 → unsigned int8
フレームインデックスは作成したフレーム(描画フレーム、表示フレーム、ぼかし用中間フレーム)で、
0、1、2の値のどれかが入ります。

最後のstatic_cast<UINT8*>(pData) + readRange.Beginがよく分からず困っています。
void*をUINT8*にキャストする部分が特に分かりません。
readRange.BeginはSIZE_T型で__int64、reinterpret_castでもUINT64なので、UINT8*ではなく、UINT64*でpDataをキャストすると流れる三角形が飛び飛びというかカクカクになります。

最後のコード一文だけの詳細を教えていただけると嬉しいです。

アバター
みけCAT
記事: 6426
登録日時: 10年前
住所: 千葉県
連絡を取る:

Re: キャストについて

#2

投稿記事 by みけCAT » 4ヶ月前

ポインタに対する加算は、「1」を足すとそのポインタが指す型のサイズ分先へ進む、ということになります。
今回のreadRange.Beginには既にUINT64のサイズが掛けてあるので、
pDataをUINT64*にキャストしてから足すとUINT64のサイズを二重に掛けることになり、おかしくなります。
また、標準ではvoid*に加算を行うことはできません。
そこで、1バイトのデータ型へのポインタであるUINT8*にキャストをしていますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

コダック

Re: キャストについて

#3

投稿記事 by コダック » 4ヶ月前

返信ありがとうございます。

ようやく理解出来ました。
UINT8*がそもそもメモリの基本単位なのでそれに加算してもポインタが移動するだけなのですね。
情報の欠損などはないのかと考えてはいましたが、基本的なことが出来ていないことが再認識できました。

返信

“C言語何でも質問掲示板” へ戻る