匿名使用者
匿名使用者 發問時間: 電腦與網際網路程式設計 · 10 年前

C語言 要怎得到一個函數在記憶體會佔多少空間

我試過幾種方法

都是跟sizeof有關

像是若asd是函數名,但不論函數多複雜,結果都一樣

sizeof(*asd) 總是為1

sizeof(asd) 總是為1

sizeof(&asd) 總是為4

完全試不出來,搜遍google也沒有,請問是要怎坐?

我想寫的程式是把函數指標指向記憶體中的函數,拷貝到另一片記憶體區段

不是單純指向一個函數

已更新項目:

就算能複製過去也不能執行就是..

那問一下,程式是否有類似字串的中止符'\0'來表是程式在記憶體的終結

2 個已更新項目:

打錯一堆字 = ='

我想還能看懂就不改了

3 個已更新項目:

我是因為寫的程式結構裡面有很多指標,我規範不要用成兩個指標指向同一個位置,所以遇到用同一資料的指標不論會不會改寫原資料都用memcpy,才不會亂掉,且結構中也有函數指標,所以問一下

4 個已更新項目:

這樣的話就只好對函數指標網開一面拉

4 個解答

評分
  • 其威
    Lv 7
    10 年前
    最佳解答

    沒有跨平台的作法可以用來求取函數實際編譯出的長度。

    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() 複製函式...

    而且你也不應該預設函式指標可以正確無誤的轉型成資料指標...

  • novus
    Lv 6
    10 年前

    一些補充

    1. 在 C 和 C++ 的語言機制裡面沒有任何取得 code size 的方法。

    2. sizeof 通常會在編譯早期就已經代換完,但一個函數真正的大小要等到編譯完成甚至是連結階段才會知道。

    3. void* 和函數指標的加減在c標準是明文禁止,很多編譯器都不提供,不過 GCC 是個例外。

    4. 我不知道你的用途,不過聽起來可能會需要一個有 copy-on-write 功能的 smart pointer,或者是像 flyweight 模式之類的設計。我可能猜錯了,不過還是建議你花時間瞭解一下

  • ㄚ旺
    Lv 5
    10 年前

    拿關刀來刮吳郭魚的鱗片.這用法不對....關公大刀不是這麼玩的.

    把函數指標包在結構裡.這是最簡單的用法.一來不會有程式重新分配問題.二來不會有程式於記憶體定址問題.(基本上他看起來就像是 C++ 的 Class)

    既然是結構.你要新增幾個都一樣能用.

  • 10 年前

    若是針對特定程式碼,

    是有變通的方法取得某一函式編譯後的長度,

    當然也可以把詃函式的機器碼複製去另一個記憶體位址,

    但無法去執行它,

    (若可以執行的話,系統豈不變得很不安全!)

    因此沒多大意義。

還有問題?馬上發問,尋求解答。