将int与void*组合使用

Combining an int with a void*

本文关键字:组合 void int      更新时间:2023-10-16

我需要将int和void*组合起来。我想这样做:

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

但根据我之前的消息,长int是不够的。

有人能建议怎么做吗?

PS。有些人会问我到底为什么要这么做。好吧,我正在开发一个通用事件系统(dispatch/link),它可以满足无数不同的情况。我会在代码准备好后发布

唯一的答案是使用struct

不要试图比编译器更聪明。不要过早进行优化。编写最简单、最清晰的代码,只有当你发现它太慢后,才能执行低级别优化

结构在这里更好,因为:

  1. 它是便携的
  2. 它很安全
  3. 它是c++的表意语言
  4. 它更快

让我打破你们关于比较长-长和结构的速度的神话。正如您所知,所有优化代码的方法都是从评测开始的。让我们制作简单的程序并测量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倍。

嗯,它不应该是这样的吗:

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

Thit仍然只适用于32位指针,而不适用于64位指针。没有一种内置类型适合这样的算法。

如果您想要一个可以存储int或void指针的数据结构,请使用并集。并集将是其包含的最大值的大小。你可以这样做:

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;

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

您应该使用类似uint_least64_t的东西,它可以从stdint.h获得,当然它不能容纳来自64位系统的指针,因此您需要使用许多人在评论中提到的结构。

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