给定一个gcc_jit_type指针有什么办法来获得它的大小?我一直在查看文档,但我找不到像sizeof运算符那样的示例。我想写一种通用的数据结构,它被赋予一个gcc_jit_type并从中编译。如果我不知道类型的大小,很难做。GCCJIT,获得一个类型的大小
2
A
回答
0
我设法解决了一个解决方案,但我觉得它比应该的方式更难。在我看来,肯定应该在API中添加gcc_jit_type_sizeof(...)
函数。
我意识到在C代码sizeof(T) = (size_t)(1 + (T*)0)
所以我试图用gccjit来实现这个。在做这件事时,我意识到没有真正的方法来给api增加一个指针。我试图使用加法二进制opp,但这给了我一个错误,因为两个操作数都需要是相同的类型。将一个int添加到指针在gccjit中是无效的。我尝试将一个指针分配给零,另一个指向另一个,然后添加那些但给出了奇怪结果的指针。我想这是有道理的,因为(int*)0 + (int*)1
是C.
编译错误,我想接下来的事情是这个等价的C (size_t)&((T*)0)[1] - (size_t)((T*)0)
也未能在gccjit becase的编译,你不能将指针类型为int无论是。我终于通过将它改为(char*)&((T*)0)[1] - (char*)((T*)0)
来工作,因为您可以将指针转换为另一个指针类型。
gcc_jit_rvalue* jit_sizeof(gcc_jit_context* ctx, gcc_jit_type* t)
{
const void* NULL_PTR = 0;
gcc_jit_type* t_ptr_type = gcc_jit_type_get_pointer(t);
gcc_jit_type* size_type = gcc_jit_context_get_type(ctx, GCC_JIT_TYPE_SIZE_T);
gcc_jit_type* byte_type_ptr = gcc_jit_type_get_pointer(gcc_jit_context_get_int_type(ctx, 1, 0));
gcc_jit_rvalue* one = gcc_jit_context_new_rvalue_from_int(ctx, size_type, 1);
gcc_jit_rvalue* ptr_0 = gcc_jit_context_new_rvalue_from_ptr(ctx, t_ptr_type, &NULL_PTR);
gcc_jit_rvalue* ptr_1 = gcc_jit_lvalue_get_address(gcc_jit_context_new_array_access(ctx, NULL, ptr_0, one), NULL);
ptr_0 = gcc_jit_context_new_cast(ctx, NULL, ptr_0, byte_type_ptr);
ptr_1 = gcc_jit_context_new_cast(ctx, NULL, ptr_1, byte_type_ptr);
return gcc_jit_context_new_binary_op(ctx, NULL, GCC_JIT_BINARY_OP_MINUS, size_type, ptr_1, ptr_0);
}
编辑: 我只是想出了如何将一个指针转换为整数类型为好。你可以按位自行设置结果类型为size_t。
ptr_0 = gcc_jit_context_new_binary_op(ctx, NULL, GCC_JIT_BINARY_OP_BITWISE_AND, size_type, ptr_0, ptr_0);
ptr_1 = gcc_jit_context_new_binary_op(ctx, NULL, GCC_JIT_BINARY_OP_BITWISE_AND, size_type, ptr_1, ptr_1);
return gcc_jit_context_new_binary_op(ctx, NULL, GCC_JIT_BINARY_OP_MINUS, size_type, ptr_1, ptr_0);
相关问题
- 1. 如何获得一个具有编码的类型的大小?
- 2. C++如何获得结构类型向量的大小
- 3. 如何获得一个类扩展的所有类的类型[]
- 4. 获取数据类型字节大小
- 5. C# - 类型大小
- 6. 如何获得一个变量的PHP内容的大小
- 7. libopcodes:得到一个指令的大小
- 8. 原子类型的大小
- 9. 获得统一的类型的Java
- 10. Java泛型:如何从一个方法获得泛型类型?
- 11. 如何获得一个列表大小的VB VB?
- 12. 获得Backbone集合大小?
- 13. 获得“真实”类的泛型类型
- 14. 获得一个“类型错误”当遍历,一个Ruby阵列
- 15. 获得C#类型
- 16. 获得同类型
- 17. Java:获得泛型类型
- 18. 获得一类从另一个类
- 19. 改变一个类的div的大小?
- 20. 如何获得类类型
- 21. R:获得一个列的最小值在分类变量
- 22. 从模板类获得一个“子类型”
- 23. 如何获得一个UITableView自动调整大小?
- 24. 如何获得值为一个长阵列与大小为零
- 25. 获得一个类的两个实例?
- 26. 从c得到原生类型的大小#
- 27. 如何获得一个类型的完整的C#声明?
- 28. 如何获得C#中的对象(类,结构)的大小
- 29. 如何获得具有多个类型参数的泛型类的类型? - C#
- 30. 获得一类
低容积'JIT @ gcc.gnu.org'邮件列表可能是一个更好的地方,问这样的问题 –
然后你可以自行答案在这里:) –
然后将作为第一场对象/类型的大小。 –