我需要将int与void *组合在一起。我想这样做:
long int lint = ((int)integer<<(sizeof(void*)*8)) | ((void*)ptr);
但是according to my previous message,长整数就不够了。
有人可以建议怎么做吗?
PS。有些人会问我为什么要这样做。好吧,我正在开发一个适用于无数不同案例的通用事件系统(调度/监听)。我会在准备好后发布代码......
答案 0 :(得分:3)
唯一的答案是使用struct
不要试图比编译器更聪明。不要执行过早优化。编写最简单,最清晰的代码,只有在看到它太慢后才能执行低级优化
这里的结构更好,因为:
让我把关于比较long long和struct的速度的神话破灭。如您所知,优化代码的所有方法都从分析开始。让我们简单的程序和衡量比较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倍。
答案 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 = #
// if you want to store an int
storage.value = num;
请记住,union不是结构,一次只能存储一个值。