![](/img/trans.png)
[英]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.