2012-02-12 29 views
0

intとvoid *を組み合わせる必要があります。私が好きなことをやって考えていた:intをvoidと組み合わせる*

long int lint = ((int)integer<<(sizeof(void*)*8)) | ((void*)ptr); 

しかしaccording to my previous message、long int型では十分ではありません。

誰でもこの方法を提案できますか?

PS。何人かの人々はなぜ私がこれをしたいと思うかもしれないのか尋ねます。さて、私は無数の異なるケースに対応するジェネリックイベントシステム(ディスパッチ/リッスン)を開発しています。それは準備ができたとき、私はあなたが多くの人が持っているとして、あなたが構造体を使用する必要があり、そのための当然それは、64ビット・システムからのポインタを保持することはできません、stdint.hから入手uint_least64_tのようなものを、使用する必要があります...

+0

intポインタまたはvoidポインタのいずれかの値を格納しようとしていますか? – LandonSchropp

+3

何をしようとしていても、それは絶望的にその形式で移植できません。普通の 'struct 'を使っていないのはなぜですか? – Mat

+5

なぜ 'struct'を使用しないのですか? :| – amit

答えて

1

うーん、それはのようなものであってはなりません。そのような算術に適合する組み込みタイプはありません。

+3

私の経験では、醜い場合は間違った解決策です。上記は醜いです。 –

+0

私は同意し、ポインタをintと組み合わせなければならない場合は、このアプローチを提案しません。しかし、問題はこのようにそれらをどのように組み合わせるかということでしたので、私は彼が提案するものの間違いを指摘しています。 –

+0

@EdHealそれは "アセンブラー"の考え方です。 :-) –

0

をコードを掲載しますコメントで述べた。

ポインタを使用している方法は変わっているようですが、あなたがしていることにvoid*を使用する必要はないようですが、多態性で同じことをすることはできませんあなたは説明しました)。

long long res = ((long long)integer<<(sizeof(void*))) | ((long long)ptr); 

THITはまだのみ32ビット・ポインタのために働くだろうと64ビットのために動作しません。

+1

これは、ポインタを保持できることが保証されていると同時に、それ以上の性能を保持することは非常に難しいので、その質問に対する答えではありません。 – hvd

+0

@hvd:更新されましたが、何らかの理由で 'int'の前に' long'が気づかなかった... – Necrolis

+0

他の人が指摘しているように、十分な大きさの型が存在しない可能性は非常に高いです。ポインタがすでに64ビットであるプラットフォーム。 'uint_least64_t'ではなく、おそらく' uintptr_t'と同じ型のtypedefです。 – hvd

0

intポインタまたはvoidポインタのいずれかを格納できるデータ構造を使用する場合は、unionを使用します。組合はそれに含まれる最大の価値の大きさになります。

typedef union { 
    void *data, 
    int *value 
} myUnion_t; 

myUnion_t storage; 
int num = 10; 

// if you want to store a void pointer 
storage.data = &num; 

// if you want to store an int 
storage.value = num; 

ユニオンは構造体ではなく、一度に1つの値しか格納しないようにしてください。

+0

彼は一方の値が両方を同時に保持したいので、組合は正しい答えではありません(普通の構造体です)。 – Sven

+1

ああ、これの全体のポイントは何ですか? – LandonSchropp

3

唯一の答えは

がコンパイラよりも賢いことをしようとしないでください構造体を使用することです。早すぎる最適化を実行しないでください。最も単純かつ明確なコードを書くと、あなたは遅すぎるそれを見た後にのみ、低レベルの最適化を行うため

構造体は、ここに優れている:それは、C++ ideomaticある

  • それは安全な
  • ポータブルである

    1. より速いです。です。

    長いロングと構造体のスピードを比較することについて私の神話をバストしてください。ご存知のように、コードを最適化するためのすべての方法は、プロファイリングから始まります。long longstruct Sのベクトルの簡単なプログラムおよび測定速度比較を行うことができます:1.5倍高速

    >g++ src.cpp -O3 
    >a 
    result: 90000; Time: 327 
    result: 90000; Time: 188 
    

    はい、structカスタムoperator ==と:

    #include <iostream> 
    #include <string> 
    #include <vector> 
    #include <windows.h> 
    
    struct S 
    { 
        unsigned int a; 
        void* b; 
    
        bool operator==(const S& other) const 
        { 
         return a == other.a && b == other.b; 
        } 
    }; 
    
    template <typename Iterator> 
    int count_eq(Iterator begin, Iterator end) 
    { 
        int result = 0; 
        for (Iterator i = begin; i != end; ++i) { 
         for (Iterator j = i + 1; j != end; ++j) { 
          result += *i == *j; 
         } 
        } 
        return result; 
    } 
    
    template <typename Iterator> 
    void mesure(Iterator begin, Iterator end) 
    { 
        long long t0 = GetTickCount(); 
        int res = count_eq(begin, end); 
        long long t1 = GetTickCount(); 
        std::cout << "result: " << res <<"; Time: "<<(t1-t0)<<"\n"; 
    } 
    
    int main() 
    { 
        const unsigned int Size = 20000; 
        std::vector<unsigned long long> l; 
        for (int i = 0; i < Size; i++) { 
         l.push_back(i% (Size/10)); 
        } 
    
        std::vector<S> s; 
        for (int j = 0; j < Size; j++) { 
         S el; 
         el.a = j% (Size/10); 
         el.b = 0; 
         s.push_back(el); 
        } 
    
        mesure(l.begin(), l.end()); 
        mesure(s.begin(), s.end()); 
    } 
    

    は、チェック結果をします。

  • +0

    いいえ、それはありません! http:// ideone。あなたは常にvoid * = 0を設定しているのでコンパイラはそれを最適化すると仮定しているので、その比較はスキップされます。 –

    +0

    コンパイラ固有です。同じideoneは、私のコンパイラとして、 'C++ 'プロファイルの反対の結果を示しています:http://ideone.com/uBkPE – Lol4t0

    +0

    @BillKotsias、どうすれば、ideoneは64bitプラットフォームを使用しないでしょう。 ? – Lol4t0