【问题标题】:There is pointer fast as stack in C? (Without indirections but still heap)C中有指针快作为堆栈吗? (没有间接但仍然是堆)
【发布时间】:2012-07-17 09:18:50
【问题描述】:

我正在从 IL(编译的 C#\VB 代码)创建一个反编译器。有没有办法在 C 中创建引用?

编辑:
我想要比堆栈之类的指针更快的东西。有这样的事情吗?

【问题讨论】:

  • 直观地说,是 allocation 在堆上比在堆栈上慢,而不是变量的实际使用。另见this answer。如果这确实是您的问题,您可能需要优化分配策略。
  • 那么你的反编译器可能还有另一个问题,这显然不是这个问题的主题?
  • @moooeeeep 是的,它需要一点性能。 (通过大量取消引用,我得到的性能仅比 C# 高 x8,而使用堆栈我可以提高 40 倍)
  • 再次激活此问题。

标签: c reference


【解决方案1】:

引用只是语法上糖衣的指针——指针就可以了。

【讨论】:

  • 有一种方法可以用堆栈替换堆并在我使用该变量\指针时跳过间接?
  • @moooeeeep 我想要比指针更快的东西,比如堆栈。 (指针对面)有这样的东西吗?不需要间接的东西。
  • @SuperFile 我认为 C++ 编译器会将引用转换为取消引用的指针,因此没有性能提升。此外,你在编码什么对解引用敏感?
  • @EitanT:提问者可能在谈论这样的事情:int i = 0; int &j = i; j = 1;。然后,一个明智的编译器不会将引用j 转换为指针,它只会使用j 作为与i 名称相同的变量的替代名称。或者也许编译器可以将它视为一个指针,然后优化器以相同的结果消除该指针,就好像它一开始就不是一个指针一样。
【解决方案2】:

指针是两个完全独立的概念。

引用就像一个指针,一种访问/传递变量而不复制它的方法。 另一方面,堆栈和堆是变量存在的两个不同位置。 变量是否应该存在于堆栈或堆中的决定完全独立于您传递它的方式。

  • 如果您需要一个局部变量,其生命周期会自动耦合到您的函数作用域,请在堆栈上声明它。分配很快,但是当函数作用域结束时对象就消失了。考虑到这一点,您可以通过值或通过指针将变量传递给其他函数。
  • 如果您需要一个在函数范围内存在的变量,您需要将其设为全局(或静态),或者将变量动态地放在堆上。分配有点慢,但一旦它在那里,你可以像其他一样使用它。您可以通过值或指针传递它。 (请记住,您最终需要取消分配动态创建的对象。)

如果堆分配确实是性能瓶颈,则应确保尽可能使用自动变量(在堆栈上)。然后,对您的分配模式进行分析。最后是optimize your allocation strategy

【讨论】:

  • C# 使用了很多引用,然后我使用了指针,没有它我无法创建 GC。
猜你喜欢
  • 1970-01-01
  • 2021-08-04
  • 2012-02-05
  • 2015-11-16
  • 2014-12-04
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
相关资源
最近更新 更多