【问题标题】:Assignments of vector: Static versus Dynamic向量的分配:静态与动态
【发布时间】:2012-05-19 18:32:26
【问题描述】:

我在这里写了一些C代码,遇到了一个问题:

我有一个自定义类型的数组。我想为这个数组设置一个大小:

typedef struct reg Reg;
Reg myArray[958279];

当我运行我的程序时出现分段错误。

然后我尝试使用 malloc,它动态分配存储空间,令我惊讶的是它起作用了:

Reg *myArray = (Reg*)malloc(sizeof(Reg)*958279);

所以我假设静态形式的数组声明必须有一些大小限制。

在某处有没有提到这个事实?还是我对我的问题完全错了?

【问题讨论】:

  • 第一个是栈分配,第二个是堆分配。堆栈分配非常快,但每个线程的堆栈大小有限(我的系统上为 8 MB,但我看到它低至 512 KB)。
  • 你知道C语言的文档中提到过这个事实吗?
  • @JamesMcLaughlin:你怎么知道的?据我所知,第一个可能是静态分配... :-)
  • @KerrekSB 像你这样的聪明人是我发表评论而不是答案的原因。 ;-)

标签: c arrays allocation


【解决方案1】:

您的第一段代码中的数组可能是在堆栈上分配的并且不适合。堆栈通常具有固定大小,您不得在堆栈上分配大对象。正如您所发现的,解决方案是从堆中分配。

【讨论】:

  • 你知道C语言的文档中提到过这个事实吗?
  • C 标准没有说明任何关于该主题的内容。例如,符合标准的 C 实现必须提供的堆栈空间没有最小量。系统的那部分始终是特定于实现的。在大多数系统上,为线程分配/保留的堆栈数量可以由程序/编译器控制。但是不要认为让你的筹码变得很大是个好主意。以后可能会回来咬你。通常,坚持系统默认堆栈大小是很有意义的。
  • 另外,您可以为数组提供静态存储持续时间(= 使其成为全局),这甚至可能更快。
  • @kerrek 为什么会更快?进程生命周期中的单个分配不太可能主导性能。通常语义决定存储决策。
  • @DavidHeffernan:视情况而定。如果 OP 在循环中使用构造,他可能会重复分配空间。这只是一个想法。此外,静态存储可以更好地保证您实际上可以获得空间(如果没有,您将在加载时失败)。
猜你喜欢
  • 2020-12-05
  • 2012-11-08
  • 2016-02-01
  • 2020-06-15
  • 2018-10-01
  • 2021-04-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
相关资源
最近更新 更多