我目前正在計算傳遞給函數的參數的總大小(以字節爲單位)。理論上,每個參數都可以寫出sizeof(x)
。但是,如果想爲許多功能做這件事,這是一個巨大的浪費時間。我試圖找出參數的空間量,以便我可以分配適量的內存來存儲它們並存儲它們(對於具有混合類型的各種函數)。C函數計算參數的總大小
我正在尋找一個表達式,可以確定所有參數的大小,以一個非變量函數,無論他們的名稱和無論有多少(在理由,我很好,只支持現在有64個參數)。它可以是一個函數,一個預處理器宏,我對實現不可知。我也會對處理可變參數函數感興趣,但我很確定這是不可能的,因爲當你進入可變參數函數時,你已經失去了關於數據類型的所有信息。
目前,我發現三種方法可能會扭曲,讓我這樣做。第一個基於Laurent Deniau's arg counting的概念。理論上,我可以使用一個宏來生成函數頭,並且執行一些類似的花式步驟來獲取參數的數量並派發到處理每個有N個參數的每個個案的各種宏。 (見:醜)。基本上,我只是使用宏對所有函數名稱進行別名,然後在其中的每一個上使用sizeof。問題是,我需要爲每個我想表示的參數創建一個宏。而且我真的不想讓64個(或更多)的東西去完成一項工作。
第二種方法是嘗試遵循Ben Klemer's 'better variadic' stuff的方法。我不會使用他所有的方法,但我會嘗試生成一個結構體,它將一個函數的參數簽名表示爲結構體。然後,我可以嘗試獲取結構元素的大小(或者甚至是結構本身,如果我關心的是對空間的保守估計)。這有幾個問題。首先,它可能只適用於C99兼容的東西(仍在檢查)。其次,它導致爲每個實現的功能創建一個額外的結構。這並不完全是一個問題,但它仍然存在一個問題,即他構造一個結構的方法最終會使用與函數相同的名稱(因此您仍然需要引用名稱來使用它們)。不過我可以解決這個問題。
第三種方法可能是遞歸宏,儘管我不確定編譯器有多高興。理論上可以通過調用形式爲POPPER(arg, ...) POPPER(VA_ARGS) + sizeof(arg)
的宏來遞歸地彈出VA_ARGS中的元素。很顯然,當VA_ARG爲空(並確保您不會被浮動+符號捕獲)時,需要暫停規則,但您明白了。
任何這些東西,讓我做到這一點:
- 好,靈活的方式來從宏觀可變參數解開VA_ARGS。如果有什麼辦法可以索引它
- 遞歸宏的一個很好的例子,它可以被用來做到這一點(以及它在最大參數,編譯器兼容性,標準符合性等方面的限制)。
- 一種通過不同類型的功能檢查直接獲取所有參數總大小的方法。 GCC似乎有一些crazy函數用於構建可能適用的呼叫轉移函數調用,但這些函數是特定於編譯器的,幾乎沒有記錄,並且似乎沒有報告它們分配的內存塊的大小。他們還彙報了大量不相關的信息。
'sizeof()'從來沒有浪費任何時間,因爲它總是在編譯時由編譯器計算。這不是一個功能,而只是一個操作員。 – x4u 2011-06-02 18:51:53
我贊成你的籌備性研究,但是你有具體的可回答的問題嗎? – 2011-06-02 18:54:24
它可以通過一種或多或少的破解和/或系統/編譯器依賴的方式完成,但給你一個體面的建議,如果你能回答這個問題,那將是很好的:你打算如何處理這些信息,你什麼時候做需要它? (在運行時,編譯時間還是簡單地作爲源代碼度量?) – x4u 2011-06-02 18:56:47