"(jlong​​)(ptrdiff_t)(void *)"的目的是什么?在heapViewer.c(一个JVMTI演示)?

时间:2014-06-04 02:09:52

标签: heap-dump jvmti

以下是演示代码():

/* Typedef to hold class details */
typedef struct {
     char *signature;
     int   count;
     int   space;
 } ClassDetails;
 ....
/* Tag this jclass */
err = (*jvmti)->SetTag(jvmti, classes[i], (jlong)(ptrdiff_t)(void*)(&details[i]));

SetTag的原型是     jvmtiError SetTag(jvmtiEnv* env, jobject object, jlong tag)

我可以像这样使用它:     err = (*jvmti)->SetTag(jvmti, classes[i], (jlong)(&details[i]));

1 个答案:

答案 0 :(得分:0)

当使用作为指针的标记时,使用强制转换为ptrdiff_t(标准C typedef表示保存指针差异的整数)避免编译器警告和错误。 永远不要使用int或long,你会发现 int和long并不总是足以容纳指针,截断你的地址,其中ptrdiff_t总是足够大以容纳所有的位指针。 详细信息请访问JVMPI transition to JVMTI