alloca
在现实世界中使用得如何?在合理的时候我应该教我的学生使用alloca
吗?还是我应该教他们不要使用它?来自C ++ RAII背景,不必free
手动调用的想法听起来很有希望,尤其是在具有多个出口点的函数中。
alloca
在现实世界中使用得如何?在合理的时候我应该教我的学生使用alloca
吗?还是我应该教他们不要使用它?来自C ++ RAII背景,不必free
手动调用的想法听起来很有希望,尤其是在具有多个出口点的函数中。
Answers:
如果你持有的一般C编程的课程,你不应该教给他们的事,是不是标准。初级程序员不必要地编写非标准和/或非便携式代码,因为它们是通过这种方式来学习的,这在过去20到30年左右的时间里一直是软件行业的一个巨大问题。不教给他们标准的代价,仅是标准就没有什么可能是天文数字。
如果您正在学习算法或应用程序编程方面的高级课程,那么最好提一下。另一方面,我已经编写了15年的程序,从硬实时嵌入式应用程序到Windows应用程序启动程序,都从未使用过该功能。
我可以看到发生了两件事:
学生了解的影响alloca
,了解堆栈和堆之间的区别,并alloca
谨慎使用。(不太可能)
学生认为“哇,这就像malloc
不用担心free
,”,请过度使用它,导致堆栈溢出,不知道发生了什么。
我认为如果您描述会更好alloca
,然后运行以下代码:
#include <malloc.h>
int OverflowMyStack(int start) {
if (start == 0)
return 0;
char * p = (char *)_alloca(4096);
*p = '0';
return OverflowMyStack(start - 1);
}
int main () {
return OverflowMyStack(512);
}
资料来源:http : //www.strchr.com/alloca
向他们展示危险,然后告诉他们不要使用它。他们仍将了解堆栈与堆的关系,了解实际的危险,并且可以继续使用标准的东西。
_alloca
而不是alloca
?为何要转换结果?
这个问题的答案应该基于 您的目标。
您是否要教一个已经知道如何编程如何编写C并在野外使用现有C代码的人?如果是这样,请介绍alloca以及您想要的其他任何内容。
另一方面,如果您要讲授的入门课程仅是巧合地使用C(并且由于C是非常小的语言,等等),则应重点关注重要部分(编写模块化程序,子例程,集合等)。 )。从学生的角度来看,alloca是多余的,因为在大多数情况下malloc足够了,从良好的代码角度来看,您最好明确地提到手动内存管理如何令人讨厌以及其他语言如何解决此问题。毕竟,还有更多内存管理,然后是alloca或RAII,所以您真的不应该局限于这些,并且正如您已经提到的那样,如果将alloca与其他“更标准”的方法用其他语言进行处理相比,则更容易理解alloca的目的。 (或C99 ...)
没有。
C程序员甚至应该意识到alloca的存在的唯一原因是理解并修复正在使用它的遗留代码。
的任何使用alloca
是
除了一些我从未发现任何真实示例的思想实验之外,没有针对alloca
(或VLA)既没有用处也没有脆弱性的使用案例(上述两种情况之一)。
alloc
是100%等效于固定大小的自动阵列,并且不那么便携。
T foo[5000];
。
std::mutex
,则可以为五千个互斥对象调用内核调用和上下文切换。不便宜。更不用说在数组后放置局部变量的额外缓存成本。
在海湾合作委员会的文件有几个实用的优点和缺点在alloca()
。从实际的角度来看,大量的自由软件都在使用它,因此很高兴了解它的工作方式以及在现有代码中的使用位置。
将-Wl,-stack=
new-stack-size传递给gcc会增加最大堆栈大小。如果您的项目使用alloca()
,或分配大型临时数组或使用递归超过特定于上下文的深度,则需要执行此操作。