尝试次数:
template<typename THigh, typename TLow>
inline size_t compact(THigh hi, TLow lo){
return (reinterpret_cast<size_t>(hi)<<32) | reinterpret_cast<size_t>(lo);
}
Types THigh,TLow可以是数字类型或指针类型的任意组合。编译器对提议的变体发誓invalid cast。
尝试二:
template<typename THigh, typename TLow>
inline size_t compact(THigh hi, TLow lo){
return (static_cast<size_t>(hi)<<32) | static_cast<size_t>(lo);
}
编译器又在抱怨了invalid static_cast。宏中的更改绝对没有任何作用。您可以编写四个函数,但它们的代码本质上是相同的。
您可以使用已弃用的 c 样式:
template<typename THigh, typename TLow>
inline size_t compact(THigh hi, TLow lo){
return ((size_t)(hi)<<32) | (size_t)(lo);
}
但是这种风格隐藏了(微妙的)类型转换。
通常,您需要组合所有选项:
void*, size_t
size_t, void*
void*, void*
需要此功能才能将具有 32 位访问权限的 MMIO 中的数据转换为 64 位系统的指针。即高位或低位部分为数字,其余为指针。数字和数字只会是一个副作用。
size_t有 64 位。指针 - 64 位。一切都是 64 位的,只有一些参数是数字,还有一些是指针。
1 个回答