我正在开发OpenGL的软件实现,而OpenGL似乎要求我返回32位指针。为了节省时间,我将其放入64位系统的C语言map中,以便从32位伪地址中检索64位指针。但是,在32位系统上,这会造成麻烦,因此我应该逐字使用指针。
这基本上是我要在共享标头中执行的操作:
#if <64-bit>
#include <search.h>
extern void * pointerTable;
typedef struct {
int key;
void* value;
} intPtrMap;
inline int compar(const void *l, const void *r) {
const intPtrMap *lm = l;
const intPtrMap *lr = r;
return lm->key - lr->key;
}
inline uint32_t allocate(size) {
void* result = malloc(size);
intPtrMap *a = malloc(sizeof(intStrMap));
a->key = (uint32_t) result;
a->value = result;
tsearch(a, &pointerTable, compar);
return (uint32_t) result;
}
inline int getPtr(ptr) {
intPtrMap *find_a = malloc(sizeof(intPtrMap));
find_a->key = ptr;
void *r = tfind(find_a, &root, compar);
return (*(intPtrMap**)r)->value;
}
#else
inline uint32_t allocate(size) {
return (uint32_t) malloc(size);
}
inline uint32_t getPtr(ptr) {
return (uint32_t) ptr;
}
#endif
Run Code Online (Sandbox Code Playgroud)
如果第一个如何做任何建议?
如何确定指针大小预处理器 C (?)
以便携式方式确定指针大小是很棘手的。
各种指针大小
指向函数的指针比指向对象或void*.
指向int char, 的指针struct可以有不同的大小,尽管这种情况很少见。
因此,让我们减少确定void *指针大小的任务。
预处理器数学
PP 数学是有限的,所以代码需要小心。让我们继续讨论整数数学。
(u)intptr_t
(u)intptr_t非常常用的可选类型在这里很有用。它们允许将 a 转换为void *整数,然后转换为等效的void*。
尽管整数类型的大小可能与指针类型不同,但我断言这种情况很少见,并且可以_Static_assert从 C11 中检测到。
以下将处理许多 C11 平台。通用解决方案的有用想法。
#include <stdint.h>
// C11
_Static_assert(sizeof (void*) == sizeof (uintptr_t),
"TBD code needed to determine pointer size");
// C99 or later
#if UINTPTR_MAX == 0xFFFF
#define PTR16
#elif UINTPTR_MAX == 0xFFFFFFFF
#define PTR32
#elif UINTPTR_MAX == 0xFFFFFFFFFFFFFFFFu
#define PTR64
#else
#error TBD pointer size
#endif
Run Code Online (Sandbox Code Playgroud)
[编辑 2021]
随着有什么办法来计算在编译时整数类型的宽度是多少?,代码可以在编译时使用下面的来找到uintptr_t.
/* Number of bits in inttype_MAX, or in any (1<<k)-1 where 0 <= k < 2040 */
#define IMAX_BITS(m) ((m)/((m)%255+1) / 255%255*8 + 7-86/((m)%255+12))
#define UINTPTR_MAX_BITWIDTH IMAX_BITS(UINTPTR_MAX)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
564 次 |
| 最近记录: |