问题标签 [static-memory-allocation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
111 浏览

c - Learn C the Hard Way 的 ex17 数据库设计问题

我真的坚持这个。ex17 应该通过提供一个简单的数据库来教我堆和堆栈内存分配(我的问题是具体的,但我会把它留在那里以防万一您需要完整的代码)。关于数据库某些设计决策的目的是什么没有太多解释,这就是我寻求帮助的原因。

1)必要性或只是设计方便(约定)?

我不确定为什么会有三个结构。在代码中还有类似的表达式(希望您理解变量的名称)conn->db->rows[i]。我的问题是这三个是必要的吗?我的意思是,为什么我们需要一个连接结构?为什么不直接创建一个独立FILE *file的东西并完全避免使用struct Database *db指针呢?

2)可能这会对我第一个有帮助。在Extra credit练习的 aka(自己制作)部分,有一个任务如下:Try reworking the program to use a single global for the database connection. How does this now version of the program compare to the other one?那么这只是要求我重新设计管理此数据库的“3 结构方式”吗?

0 投票
2 回答
84 浏览

c++ - 下面的代码做了什么样的内存分配(动态或静态)?

数组的大小由用户在运行时输入,但内存是在堆栈上分配的。这是什么类型的内存分配?静态还是动态?

0 投票
1 回答
963 浏览

c++ - 如何在C++中创建一个没有动态内存分配的链表作为模板

我开始阅读《Hands-On System Programming in C++》一书,并尝试使用没有动态内存分配的模板创建以下链表。但是每次我尝试构建链表时,除了必须用 new 分配内存之外别无他法 - 我将如何创建一个新节点?

据我了解,有一种方法可以通过使用 c++ 模板来代替创建新节点的需要,因为分配动态内存被认为很慢。到目前为止,这并不意味着在编译时使用静态内存分配或数组或宏编程,而是在运行时具有相同的灵活性?或者这是一种误解?

我错过了什么?预先感谢有关如何在不使用 C++ 模板进行动态内存分配的情况下动态创建链表的任何提示?

“这些类型的链表(和其他数据结构)在互联网上有几种实现,它们提供了链表的通用实现,而不需要动态分配数据。” 我在 C++ 中没有找到任何内容 :(

“在前面的示例中,我们不仅能够创建一个没有宏或动态分配的链表(以及使用 void * 指针带来的所有问题),而且我们还能够封装功能,提供更简洁的实现和用户 API。”

这就是我试图做的,但我困惑的每一种方式我都必须动态分配内存:

本书中关于 C++ 模板的全文:C++ 中的动手系统编程

C++ 中使用的模板

模板编程通常是 C++ 的一个被低估的、被误解的补充,没有得到足够的信任。大多数程序员只需尝试创建一个通用链表即可了解原因。

C++ 模板使您能够定义代码,而无需提前定义类型信息。

在 C 中创建链表的一种方法是使用指针和动态内存分配,如以下简单示例所示:

在前面的示例中,我们使用 void * 将数据存储在链表中。如何使用它的示例如下:

这种方法有几个问题:

这种类型的链表显然不是类型安全的。数据的使用和数据的分配是完全不相关的,需要程序员使用这个链表来无误地管理这一切。节点和数据都需要动态内存分配。如前所述,内存分配很慢,因为它们需要系统调用。通常,此代码难以阅读且笨拙。

创建通用链表的另一种方法是使用宏。这些类型的链表(和其他数据结构)在互联网上流传着多种实现,它们提供了链表的通用实现,而无需动态分配数据。这些宏为用户提供了一种方法来定义链表将在编译时管理的数据类型。

除了可靠性之外,这些方法的问题在于这些实现使用宏以一种不太优雅的方式来实现模板编程。也就是说,在C语言中加入泛型数据结构的解决方案是使用C语言的宏语言手动实现模板编程。程序员最好只使用 C++ 模板。

在 C++ 中,可以创建像链表这样的数据结构,而无需在声明链表之前声明它所管理的类型,如下所示:

在前面的示例中,我们不仅能够创建一个没有宏或动态分配的链表(以及使用 void * 指针带来的所有问题),而且我们还能够封装功能,提供更简洁的实现和用户 API。

经常对模板编程提出的一个抱怨是它生成的代码量。大多数来自模板的代码膨胀通常源于编程错误。例如,程序员可能没有意识到整数和无符号整数不是同一种类型,从而在使用模板时导致代码膨胀(因为创建了每种类型的定义)。

即使不考虑这个问题,使用宏也会产生同样的代码膨胀。天下没有免费的午餐。如果您想避免使用动态分配和类型转换,同时仍然提供通用算法,您必须为您计划使用的每种类型创建一个算法实例。如果可靠性是您的目标,那么允许编译器生成确保您的程序正确执行所需的代码比缺点更重要。

我错过了什么?预先感谢有关如何在不使用 C++ 模板进行动态内存分配的情况下动态创建链表的任何提示?

0 投票
2 回答
123 浏览

c - 取消引用的未初始化指针在内存中的位置?

我在一个介绍性的嵌入式系统课程测验中有这个 c 代码示例:

我想知道 * l2 在内存中的内存段、子段、权限和生命周期。

我的理解是指针 l2 将首先在堆栈子段中分配,然后因为它未初始化,它将获得一个垃圾值,在这种情况下,它是它在堆栈中找到的任何值;我认为它在具有静态生命周期的 .text 或 .const 中,并且这些答案都不正确,所以我在这里遗漏了什么吗?


编辑:

在我没有正确解决这一点的情况下通过了测验后,解决方案表显示它在 heap with indefinite life 中。我从这个答案中得到的是:因为指针本身存储在堆栈中并且它指向的对象未初始化(它不是自动或静态的),所以它存储在堆中..我猜?

0 投票
1 回答
58 浏览

c++ - 动态内存分配导致 SIGSEGV(信号:分段违规),试图使用 malloc 和 free

我正在用 c++20(Mingw-w64 clion)创建一个数学数据结构,由于它的容量和大小,我可以将其部分地从内存卸载到存储,反之亦然。在学习如何使用内存时,我测试了一个特定的代码,据我所知它应该可以工作。但是应用程序由于分段违规(SIGSEGV)而崩溃,我无法推断出为什么会这样。我将衷心感谢您的帮助。


  • 以下不起作用。

    但下面的其他人正在工作。
    这个:-

    和这个:-


    编辑 atomic_logic 不是很重要,但下面是 logic_sym。

  • 0 投票
    3 回答
    119 浏览

    c - 基于自动变量的绝对最坏情况堆栈大小

    在 C99 程序中,在(理论上)假设我没有使用可变长度数组,并且我的每个自动变量在整个堆栈中一次只能存在一次(通过禁止循环函数调用和显式递归),如果我总结他们消耗的所有空间,我可以声明这是可能发生的最大堆栈大小吗?

    这里有一点上下文:我告诉一个朋友,我编写了一个程序,不使用动态内存分配(“malloc”)并分配所有内存静态(通过在一个结构中建模我的所有状态变量,然后我将其声明为全局)。然后他告诉我,如果我使用自动变量,我仍然会使用动态内存。我认为我的自动变量不是状态变量而是控制变量,所以我的程序仍然被认为是静态的。然后我们讨论了必须有一种方法来说明我的程序的绝对最坏情况行为,所以我提出了上述问题。

    额外的问题:如果上述假设成立,我可以简单地将所有自动变量声明为静态并最终得到一个“真正的”静态程序?

    0 投票
    1 回答
    93 浏览

    c++ - 检测指针目标:静态内存还是动态内存?

    在 C++ 中是否有检测指针目标是从动态内存分配还是存在于静态内存(包括全局内存)中的功能?

    在下面的示例中,我希望仅在指针的目标驻留在动态内存中Destruction时才调用该函数。delete(这是实际代码的最小化版本。)

    问题的基础是我在Destruction函数中遇到异常错误,因为指针指向静态整数。

    设计是工厂模式函数返回一个指向基类的指针。指针可能指向作为单例(静态内存)的子对象或来自动态内存的子实例。调用一个函数来关闭程序(想想 GUI 的关闭),如果指针的目标来自动态内存,则需要将其删除。

    我正在寻找一种解决方案,我不必担心删除或不删除指针的目标。

    0 投票
    1 回答
    62 浏览

    arrays - 在 C99 中的连续内存中分配两个全局数组

    我想为闪存访问模块编写一些单元测试。我有

    我认为将我自己的数组作为闪存内容注入是完美的,因为在应用程序中这些符号是通过链接器文件提供的。在我的测试中,我想要类似的东西:

    但是我需要第二个数组在第一个数组之后开始。我尝试了很多,但我无法让它为我工作。有没有办法实现给定的声明并在内存中有连续的数组?

    [编辑 1/2021]

    我需要_internal_flash_end位于的地址,_internal_flash_start + sizeof(_internal_flash_start)因为代码必须通过这些名称引用数组。

    0 投票
    0 回答
    44 浏览

    c++ - 数组的静态声明和动态声明有什么区别

    我是 C++ 编程的新手,我了解到所有静态变量都是在编译时分配在堆栈内存上的,因此在编译器编译之前应该知道它们的大小。

    但是动态变量是在非常大的堆内存上分配的,编译器不需要事先知道大小

    所以我尝试了 数组的静态动态声明,并在运行时给它们大小,但程序运行良好。

    那么,除了一个在堆上之外,它们之间有什么区别?就像两者都是数组的大小只有 n

    输入:1000

    输出:

    0 投票
    0 回答
    1484 浏览

    python - Spyder IDE:重新启动内核..,spyder 中的 ipython 控制台

    我遇到了一个问题,当我在 Spyder IDE 上运行 ML 模型时,我的内核会自动重新启动

    以下是 ipython 控制台的输出