2012-07-17 81 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