2012-05-10 16 views
1

これは32ビットアプリケーション用であると仮定します。私は一緒に一意に特定のオブジェクトを識別する2つのID値を持っています。各IDはプレーンな32ビットintですので、特定のオブジェクトを識別するためには、両方のID値をまとめておく必要があります。構造体とint64の値

心に来る最初のソリューションは、それらを格納するために2つの別々の値としてあり、かつ構造体の周りにそれらを渡す:

struct { 
    int id1; 
    int id2; 
}; 

私は、それらを周りに渡すことができればしかし、それはいいだろう1つの32ビットID値があるときに戻ったので、構造体のペアではなく、単一の値を返します。

もう一つの考え方は、uint64_tの上半分と下半分として格納することです。

私の質問は、2つの方法の間に実際の違いはありますか?どちらの場合でも、同じバイト数が渡されていますが、CPUが64ビット値をネイティブに処理していないため、int64に特別なオーバーヘッドがあるかどうかはわかりません。

+0

"*最初の解決策は何を考えていますか?*"問題の解決方法は? – ildjarn

+0

構造体*は単一の値です。あなたが言うように、いずれかの方法で8バイトを渡す必要があります。 –

+0

@ildjarnおそらく2つのIDを周りに渡すために、それは残りの質問から暗示されていると思います。 –

答えて

1

あなたが気にすることができない場合は、ユニオンを使用してください。

マイクロソフトでは、たとえばLARGE_INTEGER unionを定義しています。

2

構造体を使用しない理由はありません。

+4

確かにあります。 'uint64_t'は構造体のために手作業で生成しなければならない' == 'や' <'などの便利な演算子をいくつか定義しています。 –

+0

@マーク:良い点は、オペレーターがナイロウに期待される行動をしている場合だけです。辞書編集の比較をしたくない場合は、とにかく(で)等価演算子を実装する必要があり、単純な構造がより簡単になる可能性があります。 –

+0

@ MarkRansom:もしOPが彼が彼らを望んでいれば...? – Puppy

5

最高の処理は、エンティティの処理方法によって異なります。通常、/ 2つのサブフィールドを1つの単位として比較した場合、int64は有効です。サブフィールドを独立して検査することが多い場合、構造体はより自然です。