2012-07-17 80 views
-1

我從IL(編譯C#\ VB代碼)創建一個反編譯器。有沒有什麼辦法可以在C中創建引用?C中有堆棧指針快嗎? (沒有間接但仍堆)

編輯:
我想要的東西比指針像堆棧更快。有沒有這樣的事情?

+1

直觀上,它是堆中比堆中慢的_allocation_,而不是實際使用的變量。另見[這個答案](http://stackoverflow.com/a/79936/1025391)。如果這確實是您的問題,您可能需要優化分配策略。 – moooeeeep 2012-07-17 09:36:00

+0

我知道,我的反編譯器優化了分配(約x11.5更快),並且當我使用大量引用(在解壓縮後轉換爲指針)時,我看到性能下降。 – 2012-07-17 09:46:06

+0

那麼你的反編譯器可能有另一個問題,這顯然不是這個問題的主題? – moooeeeep 2012-07-17 09:55:16

回答

1

堆棧指針是兩個完全獨立的概念。

引用就像一個指針,一種訪問/傳遞變量而不復制它的方法。另一方面,堆棧和堆是變量存在的兩個不同的地方。 決定一個變量是否應該存放在堆棧或堆上是完全獨立於你傳遞它的方式。

  • 如果您需要一個局部變量,並將自動耦合到您的函數範圍的生命週期聲明在堆棧上。分配速度很快,但功能範圍結束時該對象不見了。考慮到這一點,您可以通過值或通過指向其他函數的變量來傳遞變量。
  • 如果您需要一個在函數作用域中存在的變量,則需要將其設置爲全局(或靜態),或將該變量動態地放在堆上。分配有點慢,但一旦它在那裏,就可以像其他人一樣使用它。你可以通過價值或指針來傳遞它。 (請記住,您需要最終取消動態創建的對象)。

如果堆分配確實是性能瓶頸,則應確保在可能的情況下使用自動變量(在堆棧上)。然後,分析你的分配模式。最後optimize your allocation strategy

+0

C#使用引用很多,然後我用指針,沒有,我不能創建GC。 – 2012-07-17 09:51:24

6

引用只是一個語法上糖衣的指針 - 一個指針可以做得很好。

+0

有一種方法可以用堆棧替換堆並在我使用該變量\指針時跳過間接方向? – 2012-07-17 09:22:08

+0

@SuperFile,No. [注意:指針指向的內容可以在堆棧或堆上。同上參考。](http://stackoverflow.com/a/57492/1025391) – moooeeeep 2012-07-17 09:33:25

+0

@moooeeeep我想要比指針更快的東西比如堆棧。 (指針對面)有這樣的事情嗎?一些不需要間接的東西。 – 2012-07-17 09:34:48