給定一個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'郵件列表可能是一個更好的地方,問這樣的問題 –
然後你可以自行答案在這裏:) –
然後將作爲第一場對象/類型的大小。 –