[英]invalid conversion from 'void* (*)(int*)' to 'void* (*)(void*)'
[英]Combining an int with a void*
我需要将int与void *结合使用。 我正在考虑这样做:
long int lint = ((int)integer<<(sizeof(void*)*8)) | ((void*)ptr);
但是根据我之前的消息 ,长整型是不够的。
谁能建议该怎么做?
PS。 有人会问为什么我可能要这样做。 好吧,我正在开发一个通用事件系统(调度/侦听),该系统可以满足无数不同的情况。 准备就绪后,我将发布代码...
唯一的答案是使用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
是的,使用自定义operator ==
struct
快1.5倍。
嗯不应该是这样的:
long long res = ((long long)integer<<(sizeof(void*))) | ((long long)ptr);
Thit仍仅适用于32位指针,不适用于64位。 没有适合此类算术的内置类型。
您应该使用类似stdint.h
uint_least64_t
这样的东西,当然它不能保存来自64位系统的指针,因为您将需要使用注释中提到的许多人所使用的结构。
尽管您使用指针的方式看起来很怪异,但看起来您甚至不需要在执行操作时使用void*
,也不要忘记可以通过多态对同一事物进行处理(对于您所描述的事件系统) 。
如果您想要一个可以存储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;
请记住,联合不是一个结构,并且一次只能存储一个值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.