2017-05-23 7 views
3

タイプ二つのポインタのポインタのエイリアスのどのようなタイプのパンニング&それの目的は何ですか?私はそれを使用するかどうかはどうしたらどうなりますか?

フォームをpunningとメモリ内の同じ位置を指すが、異なるタイプのように、その位置を表します。コンパイラは "puns"を両方とも無関係のポインタとして扱います。タイプ・ペニングは、両方のポインタを介してアクセスされるすべてのデータに依存性問題を引き起こす可能性があります。

記事は何を言っているのですか?

+4

正確には何ですか? – user463035818

+0

[[厳密なエイリアシングルールとは何ですか?](https://stackoverflow.com/questions/98650/what-is-the-strict)と重複している可能性があります。 -aliasing-rule) –

+1

[Unionsとtype-punning]の可能な複製(https://stackoverflow.com/questions/25664848/unions-and-type-punning) –

答えて

5

「パニング」とは、同じタイプの2つのポインターが同じ場所を指している場合です。例:あなたは、(いくつかの特別な例外を除いて)非互換タイプのポインタを介し同じメモリ位置にアクセスすることを許可されていないので、

// BAD CODE 
uint32_t data; 
uint32_t* u32 = &data; 
uint16_t* u16 = (uint16_t*)&data; // undefined behavior 

このコードは、C++(およびC)における未定義の動作を呼び出します。これはstrict aliasing ruleに違反しているため、非公式に「厳密なエイリアス違反」と呼ばれます。

タイプpunningを行うための別の方法は労働組合を通じて次のとおりです。

// BAD C++ CODE 
typedef union 
{ 
    uint32_t u32; 
    uint16_t u16 [2]; 
} my_type; 

my_type mt; 
mt.u32 = 1; 
std::cout << mt.u16[0]; // access union data through another member, undefined behavior 

これはまた、C++での未定義の動作である(ただし、Cに完全に罰金許可しました)。

+0

あなたは 'mt.u16 [0]'を意味します –

+0

Iユニオンの振る舞いがポッド型のC++で機能していると思った –

関連する問題