将int与void组合*

时间:2012-02-12 09:28:02

标签: c++ int sizeof void

我需要将int与void *组合在一起。我想这样做:

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

但是according to my previous message,长整数就不够了。

有人可以建议怎么做吗?

PS。有些人会问我为什么要这样做。好吧,我正在开发一个适用于无数不同案例的通用事件系统(调度/监听)。我会在准备好后发布代码......

4 个答案:

答案 0 :(得分:3)

唯一的答案是使用struct

不要试图比编译器更聪明。不要执行过早优化。编写最简单,最清晰的代码,只有在看到它太慢后才能执行低级优化

这里的结构更好,因为:

  1. 便携式
  2. 安全
  3. 这是c ++ ideomatic。
  4. 速度更快
  5. 让我把关于比较long long和struct的速度的神话破灭。如您所知,优化代码的所有方法都从分析开始。让我们简单的程序和衡量比较long longstruct S的矢量速度:

    #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()); 
    }
    

    让我们检查结果:

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

    是的,struct自定义operator ==的速度提高了1.5倍。

答案 1 :(得分:1)

嗯不应该是这样的:

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

Thit仍将仅适用于32位指针,不适用于64位。没有适合这种算术的内置类型。

答案 2 :(得分:0)

你应该使用像uint_least64_t那样的stdint.h,当然它不能保存来自64位系统的指针,因为你需要使用一个结构,就像很多人在评论中提到的那样

虽然你使用指针的方式看起来很奇怪,看起来你甚至不需要使用void*来做你正在做的事情,但是从不明白你可以用多态来做同样的事情(对于你描述的事件系统。)

答案 3 :(得分: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;

请记住,union不是结构,一次只能存储一个值。