Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中有像堆栈一样快的指针吗?(无间接,但仍为堆)_C_Reference - Fatal编程技术网

在C语言中有像堆栈一样快的指针吗?(无间接,但仍为堆)

在C语言中有像堆栈一样快的指针吗?(无间接,但仍为堆),c,reference,C,Reference,我正在从IL(编译的C#\VB代码)创建一个反编译器。有没有办法在C中创建引用 编辑: 我想要比像堆栈这样的指针更快的东西。有这样的事吗 引用只是一个语法上糖衣的指针–指针就可以了。堆栈和指针是两个完全独立的概念 引用就像一个指针,是一种访问/传递变量而不复制它的方法。 另一方面,堆栈和堆是变量所在的两个不同位置。 变量是否应该存在于堆栈或堆上的决定完全独立于您传递它的方式 如果您需要一个局部变量,其生存期自动耦合到您的函数范围,请在堆栈上声明它。分配很快,但当函数范围结束时,对象就消失了。考

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

编辑:

我想要比像堆栈这样的指针更快的东西。有这样的事吗

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

堆栈和指针是两个完全独立的概念

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

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

若堆分配确实是一个性能瓶颈,那个么应该确保尽可能使用自动变量(在堆栈上)。然后,对分配模式进行分析。最后。

有一种方法可以在我使用变量\pointer?@superfle,No.@moooeeep时用stack替换heap并跳过间接寻址。我想要比类似指针的stack更快的东西。(指针的反面)有这样的东西吗?不需要间接的。@ SuffFrm我认为C++编译器将引用转换为引用的指针,所以没有性能增益。此外,你编写的代码中有哪些内容对取消引用比较敏感?@EitanT:提问者可能在谈论这样的事情:
int i=0;int&j=i;j=1。然后,一个合理的编译器不会将引用
j
转换为指针,它只会使用
j
作为
i
为其命名的同一变量的替代名称。或者编译器可以将其视为指针,然后优化器以相同的结果消除指针,就好像它根本不是指针一样。直观地说,堆上的分配比堆栈上的分配慢,而不是变量的实际使用。另见。如果这确实是您的问题,您可能需要优化您的分配策略。我知道,我的反编译器优化了分配(大约快x11.5),我看到当我使用大量引用(反编译后转换为指针)时,性能下降。然后您的反编译器可能还有另一个问题,这显然不是这个问题的主题?@moooeeep是的,这需要一点表现。(通过大量取消引用,我的性能仅比C#高出x8,使用堆栈,我可以达到40x)再次激活此问题。C#大量使用引用,然后使用指针,否则我无法创建GC。