2016-07-15 17 views
1
typedef struct a{ 
    uint32 val1; 
    }A; 

typedef struct b{ 
    uint16 copy_val1; 
}B; 


void function1(A input) 
{ 
    B my_input; 

    my_input.copy_val1 = (uint16) input.val1; <-- Is this clean? 
} 

最初は構造体aを設計したとき、val1に2つの16ビット値が含まれると考えられました。しかし、私たちは1つの16ビットしか使用しませんでした。C typecasting uint32 to uint16

今私はメモリを節約するためにcopy_val1の型をuint32からuint16に変更しています。 きれいな方法で型キャストを行い、val1からの16ビット値がcopy_val1にコピーされることを確認する必要がありますか?

OSはMIPSアーキテクチャのvxworksです。

+0

コードは機能していませんか?このようなキャスティングはうまくいくはずです。 – Caius

+1

MIPSはアラインメントに対して非常に敏感です。コンパイラは構造体(パディング)内の要素をどのようにレイアウトするかについて多くの余裕があります。パックしないと、メモリを一切節約しないことになります。私の経験では、これは、長期的にはメモリの問題であなたを助けるつもりはないマイクロ最適化の一種です。実際、IMHOは、非常に特定のサイズになる必要のない整数値の型の最良の選択は、単純なint型です(注目すべき例外:AVRのような8ビットアーキテクチャでは、int8_tはデフォルトの正当な選択肢です) 。 – datenwolf

+0

ここでは、あなたのプログラムにあなたのプログラムに入れることができるより重要なトリックがあります:どこか 'char memory_reserve [SIZEOF_MEMORY * 5/100];を' .bss'セクションに置きます。あなたのプロジェクトで利用可能なメモリの5%。結局のところ、数か月後には、長い夜と大量のメモリで動作するアルゴリズムで使用されている配列の最後のビットを絞り出すためにあらゆる努力を払って、予約からメモリを取り除いてその日を節約することができます。 – datenwolf

答えて

1

単にuint32値をキャストなしのuint16変数に割り当てるだけで十分です。

ただし、のトランケートのリスクがあります。割り当て前にval1 > UINT16_MAXかどうか確認することを検討する必要があります。

機械レジスタが1つまたは2つ以上の構造の場合は、ポインタを構造体に渡す必要があります。さもなければ、潜在的に大きなコピーが発生します。しかし、セマンティクスの変更に注意してください。

+0

で十分ですか?私は、16ビットの値を含むビットがコピーされ、すべて0ではないことを保証していますか? val1に格納されている値は、現在16ビットのみを使用しています。だから、私は "切り捨ての危険性"で大丈夫になるはずです。 構造体へのポインタの受け渡しについての有効なポイント。これは簡単な例でした。だから私はこれをこう書いた。 –

+1

@ KingkongJnrすべての値が16ビットに収まるのに十分小さいことがわかっているなら、それは問題ありません。 32ビットから16ビットへの割り当ては、単に上位ビットを破棄します。 – Barmar

+1

単純な割り当ては、キャストが行ったのとまったく同じ変換を暗黙的に行います。整数の符号なし型への変換はよく定義されています。上位ビットを破棄します。 –

0

これはきれいです。古いコンパイラはキャストなしでもこれを受け入れます。 uint32値の下位16ビットのみを渡すことに注意してください。