我需要将int和void*组合起来。我想这样做:
long int lint = ((int)integer<<(sizeof(void*)*8)) | ((void*)ptr);
但根据我之前的消息,长int是不够的。
有人能建议怎么做吗?
PS。有些人会问我到底为什么要这么做。好吧,我正在开发一个通用事件系统(dispatch/link),它可以满足无数不同的情况。我会在代码准备好后发布
唯一的答案是使用struct
不要试图比编译器更聪明。不要过早进行优化。编写最简单、最清晰的代码,只有当你发现它太慢后,才能执行低级别优化
结构在这里更好,因为:
- 它是便携的
- 它很安全
- 它是c++的表意语言
- 它更快
让我打破你们关于比较长-长和结构的速度的神话。正如您所知,所有优化代码的方法都是从评测开始的。让我们制作简单的程序并测量long long
和struct 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 = #
// if you want to store an int
storage.value = num;
请记住,并集不是结构,一次只能存储一个值。
您应该使用类似uint_least64_t
的东西,它可以从stdint.h
获得,当然它不能容纳来自64位系统的指针,因此您需要使用许多人在评论中提到的结构。
尽管你使用指针的方式看起来很奇怪,但看起来你甚至不需要使用void*
来做你正在做的事情,更不用说你可以用多态性来做同样的事情(对于你描述的事件系统)。