2014-09-19 23 views
1

有沒有辦法在不實際運行代碼的情況下獲取特定類的所有成員變量的大小? (即沒有sizeof(),offset_of()操作)獲取類成員變量的大小(無需運行代碼)

是否objdump或otool有一些選項可以從中間目標文件(甚至是最終的ELF文件)中提取此信息?

編輯:

「我現在想幹什麼?」:

我兩者之間建立注意到我們的軟件是一個特定的類實例的大小激增的。這個類非常大,有很多很多成員變量。有問題的類在兩個構建之間沒有改變,但是它的成員變量確實存在。我試圖找到罪魁禍首(並且它會有點深度優先搜索,因爲我必須繼續深入挖掘每個成員變量,直到找到它),並且需要一個可擴展的方法來執行這無需訴諸printfs()和diffing。

+0

「無運行代碼」 - 閱讀編譯器手冊? – Galik 2014-09-19 21:53:21

+1

您可以在編譯時使用'sizeof',所以不需要'printf'。 – Jarod42 2014-09-19 22:15:18

回答

1

您可以創建一個基於Clang的工具來編譯您的代碼並在編譯時轉儲您的類的記錄佈局。然後你就可以比較它們。

(也許存在用於其它編譯器相似的方法爲好。)

2

可以打印編譯時間常數,例如不需要運行代碼就可以使用sizeof。例如:

class X 
{ 
    int x; 
    int y; 
    int z; 
}; 


template <int i> 
class foo; 

foo<sizeof(X)> x; 

錯誤消息清楚地講述了sizeof表達式的值:

test.cpp:12:16: error: aggregate ‘foo<12> x’ has incomplete type and cannot be defined 
foo<sizeof(X)> x; 

Works爲offsetof爲好。您還可以查詢多個偏移一次:

#include <cstddef> 
foo<offsetof(X,X::x)> offset_x; 
foo<offsetof(X,X::y)> offset_y; 
foo<offsetof(X,X::z)> offset_z; 

結果:

test.cpp:15:23: error: aggregate ‘foo<0> offset_x’ has incomplete type and cannot be defined 
foo<offsetof(X,X::x)> offset_x; 
        ^
test.cpp:16:23: error: aggregate ‘foo<4> offset_y’ has incomplete type and cannot be defined 
foo<offsetof(X,X::y)> offset_y; 
        ^
test.cpp:17:23: error: aggregate ‘foo<8> offset_z’ has incomplete type and cannot be defined 
foo<offsetof(X,X::z)> offset_z; 
+0

是否有類似於純C的技術(嵌入式系統,Tasking編譯器 - 切換到C++不是一個選項)? – 2015-07-15 17:22:33

+0

['負數組大小'技巧](http://stackoverflow.com/questions/28332806/what-is-the-easiest-way-to-find-the-sizeof-a-type-without-compiling-and -executin/28333116#28333116)? – 2015-07-15 17:38:26

+0

或[使用預處理器](http://stackoverflow.com/questions/7168215/determine-sizeof-float-without-compilation/7171014#7171014)? – 2015-07-15 17:47:12