4

ここでpthreads について読んでいました。ある例では、彼らはこのソース コードを提供していました。

スレッドの作成中に、関数 ! に void * 型としてキャストされた long 型を渡しています。

関数内では、この値を受け取り、逆キャストして long 値を取得します。

Q1: ポインター型をプリミティブ データ型に、またはその逆に変換することはできますか (C および C++ の場合)?

Q2. もしそうなら、これをするのは良いことですか?この long 型へのポインターを作成するべきではありません。このポインターを void * として型キャストし、関数に渡します。

プリミティブ型からポインター型への変換というこの考え方は、非常にわかりにくいと思いますか? 任意のポインタ型から void* への変換は理解できるが、なぜプリミティブ データ型が void* 型に格納されるのでしょうか? 特定のシステムで、プリミティブ型のサイズがポインター型に割り当てられたサイズよりも大きくなる可能性はありませんか?

4

1 に答える 1

5

Q1: はい。ただし、これが機能するかどうかは実装定義 (= プラットフォームに依存) です。少し安全なバージョンでは、uintptr_t代わりにlong.

Q2: 決定的にスタイルが悪いです。longを割り当ててアドレスを渡すことにより、適切にそれを行うことでパフォーマンスが大幅に低下することはありません。

于 2012-10-18T07:37:53.350 に答える