C語言 要怎得到一個函數在記憶體會佔多少空間
我試過幾種方法
都是跟sizeof有關
像是若asd是函數名,但不論函數多複雜,結果都一樣
sizeof(*asd) 總是為1
sizeof(asd) 總是為1
sizeof(&asd) 總是為4
完全試不出來,搜遍google也沒有,請問是要怎坐?
我想寫的程式是把函數指標指向記憶體中的函數,拷貝到另一片記憶體區段
不是單純指向一個函數
就算能複製過去也不能執行就是..
那問一下,程式是否有類似字串的中止符'\0'來表是程式在記憶體的終結
打錯一堆字 = ='
我想還能看懂就不改了
我是因為寫的程式結構裡面有很多指標,我規範不要用成兩個指標指向同一個位置,所以遇到用同一資料的指標不論會不會改寫原資料都用memcpy,才不會亂掉,且結構中也有函數指標,所以問一下
這樣的話就只好對函數指標網開一面拉
4 個解答
- 其威Lv 710 年前最佳解答
沒有跨平台的作法可以用來求取函數實際編譯出的長度。
function 是 incomplete type,你不能對 function 求大小(就像你不能對 void 求大小)。
但是為了讓你可以對 void * 或 function pointer 做加減,一般編譯器「強制」認為 void 與 function 的大小是 1。
可是這也造成了 sizeof(void) 與 sizeof(function) 的大小跟著變成 1 了 = =
詳情請見:http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointe...
但是... 嘿嘿~在 gcc 跟 g++ 中,你可能會遇到一些靈異事件 XD~
而且,即使你把 function 整個複製到另一個地方,也不一定能用。
因為該 function 可能是 position depenendent。
如果你想知道某個程式中某個函式的各個 byte,可以編入 debug symbole,然後用 debugger 開啟來查看。
2011-07-15 22:32:54 補充:
調整一下用詞:
「在 gcc 跟 g++ 中,你可能會遇到一些靈異事件」
改成:
「若是從 gcc 改用 g++(或 g++ 改成 gcc),你可能會遇到一些靈異事件」
2011-07-15 23:59:04 補充:
除了針對特定程式碼以外,可能還得針對特定編譯器。
2011-07-17 01:02:50 補充:
資料指標可以規範成不要用兩個指標指向同一個位置,但是函式指標(或成員指標)應該沒差。
因為程式一般是操作資料的,雖然兩個 struct 可能參照的資料不同,但是你還是會需要套用相同操作。
所以你不應該用 memcpy() 複製函式...
而且你也不應該預設函式指標可以正確無誤的轉型成資料指標...
- novusLv 610 年前
一些補充
1. 在 C 和 C++ 的語言機制裡面沒有任何取得 code size 的方法。
2. sizeof 通常會在編譯早期就已經代換完,但一個函數真正的大小要等到編譯完成甚至是連結階段才會知道。
3. void* 和函數指標的加減在c標準是明文禁止,很多編譯器都不提供,不過 GCC 是個例外。
4. 我不知道你的用途,不過聽起來可能會需要一個有 copy-on-write 功能的 smart pointer,或者是像 flyweight 模式之類的設計。我可能猜錯了,不過還是建議你花時間瞭解一下
- ㄚ旺Lv 510 年前
拿關刀來刮吳郭魚的鱗片.這用法不對....關公大刀不是這麼玩的.
把函數指標包在結構裡.這是最簡單的用法.一來不會有程式重新分配問題.二來不會有程式於記憶體定址問題.(基本上他看起來就像是 C++ 的 Class)
既然是結構.你要新增幾個都一樣能用.
- 東邪無弓Lv 710 年前
若是針對特定程式碼,
是有變通的方法取得某一函式編譯後的長度,
當然也可以把詃函式的機器碼複製去另一個記憶體位址,
但無法去執行它,
(若可以執行的話,系統豈不變得很不安全!)
因此沒多大意義。