【问题标题】:How is malloc handled at compile time and run time? [closed]malloc 在编译时和运行时如何处理? [关闭]
【发布时间】:2018-09-08 10:33:07
【问题描述】:

malloc 用于在编译时指定 - 指针指向的缓冲区(数组)的最大大小,然后在运行时和以后默认分配最大大小的缓冲区 - 实际上只有缓冲区的那部分我们需要(通过从用户等获取数据)使用(尽管分配了完整大小)?

如果上述情况属实 - 那么这意味着 malloc(与指针一起使用)本质上提供了一种将 a(包括更高维度 - 但例如 -2)二维数组建模为一维指针数组的方法,并且然后在编译时指定要分配给每个单独指针的缓冲区的大小,即基本上完成与将其声明为在编译时声明中指定的最大尺寸的二维数组相同的事情 - 但只允许对其进行不同的建模/可视化.两者都分配了默认的最大大小 - 在声明语句运行时的数组类型声明,而在 malloc 语句运行时指针+ malloc 类型(我认为在这两种情况下都使用此大小信息来计算堆栈的大小+运行所需的堆总和)。

即在指针+malloc 中,一旦编译器看到此信息(使用 malloc 的每个指针的最大缓冲区大小)在编译时可用 - 编译可以通过,因为它具有默认分配多少内存的信息,并且可以(并且确实)也可以使用该信息来计算函数运行所需的堆栈+堆总和的大小(如果没有 malloc - 那么它指向单个元素)。稍后在运行时 - 在 malloc 语句运行后分配最大大小的缓冲区,以供以后用作输入需要。

【问题讨论】:

  • 没有人能理解这个杂文,伙计。
  • malloc() 在运行时被调用,并在运行时分配内存;就程序而言,编译器不会通过malloc() 进行任何内存分配(尽管编译器的内部进行了大量的动态内存分配)。这似乎是第一句话要问的。其余部分难以理解——但我认为这是基于一个错误的前提,即malloc() 可以在编译时以某种方式完成,因此实际上并不相关。
  • 感谢@JonathanLeffler。我不知道是什么让我写“在编译时分配”。我的意思是在编译时指定默认的 max_size (如果指针类型声明必须指向非奇异数据的起始元素,则这是必需的 - 否则默认情况下它指向奇异元素),因此看到此信息可用 - 编译可以继续.除了全局和静态变量之外的所有内存实际上都是在执行实际函数时在运行时分配的。编辑我的问题比以前更有意义。
  • @JonathanLeffler:OP 需要澄清这个问题,但我们不能排除编译器在编译时而不是运行时提供内存分配的可能性。我刚刚将#include <stdio.h> / #include <stdlib.h> / int main(void) { int *a = malloc(sizeof *a); *a = 4; printf("%d\n", *a); } 编译为与-O3 一起使用Apple LLVM 9.1.0 (clang-902.0.39.2) 进行组装,生成的程序集不包含对malloc 的任何引用。跨度>
  • @EricPostpischil 你看到的是“可观察行为”的规则

标签: c arrays pointers malloc


【解决方案1】:

使用malloccallocrealloc 分配内存被称为dynamic memory management 是有原因的。在这种情况下,动态意味着在运行时发生的事情。这不会在编译时发生。

如果以上是真的……

既然不是真的,那么下面的东西就不能从它推导出来。

【讨论】:

  • 谢谢@P.W 我不知道是什么让我写了“在编译时分配”。我的意思是在编译时指定默认的 max_size (如果指针类型声明必须指向非奇异数据的起始元素,则这是必需的 - 否则默认情况下它指向奇异元素),因此看到此信息可用 - 编译可以继续.除了全局和静态变量之外的所有内存实际上都是在执行实际函数时在运行时分配的。编辑我的问题比以前更有意义
【解决方案2】:

malloc 是标准 C 库的一个函数。

所有函数都在运行时调用。

编译时唯一发生的事情就是创建一个对malloc的函数调用

【讨论】:

  • 并非所有函数都在运行时调用。我刚刚将#include <stdio.h> / #include <stdlib.h> / int main(void) { int *a = malloc(sizeof *a); *a = 4; printf("%d\n", *a); } 编译为与-O3 一起使用Apple LLVM 9.1.0 (clang-902.0.39.2) 进行组装,生成的程序集不包含对malloc 的任何引用。跨度>
  • 它是否使用指针变量?编译器可以优化,只要它仍然像原始代码被编译一样。
猜你喜欢
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
相关资源
最近更新 更多