相关疑难解决方法(0)

堆栈和堆的内容和位置是什么?

编程语言书籍解释了在堆栈上创建了值类型,并且在堆上创建了引用类型,而没有解释这两者是什么.我还没有看清楚这个问题.我理解堆栈是什么.但,

  • 它们在哪里和它们(物理上在真实计算机的记忆中)?
  • 它们在多大程度上受操作系统或语言运行时控制?
  • 它们的范围是什么?
  • 是什么决定了它们的大小?
  • 是什么让一个更快?

language-agnostic heap stack memory-management dynamic-memory-allocation

7847
推荐指数
27
解决办法
145万
查看次数

为什么两个不同的概念都被称为"堆"?

为什么运行时堆用于C风格语言中的动态内存分配,数据结构都称为"堆"?有一些关系吗?

c++ heap terminology heap-memory

144
推荐指数
6
解决办法
2万
查看次数

堆栈如何在汇编语言中工作?

我目前正在尝试理解堆栈是如何工作的,所以我决定自学一些汇编语言,我正在使用这本书:

http://savannah.nongnu.org/projects/pgubook/

我正在使用Gas并在Linux Mint上进行开发.

我有点困惑:

据我所知,堆栈只是一个数据结构.所以我假设如果我在汇编编码我必须自己实现堆栈.然而,这似乎并非如此,因为有像这样的命令

pushl
popl
Run Code Online (Sandbox Code Playgroud)

因此,当在x86架构的汇编中编码并使用Gas语法时:堆栈只是已经实现的数据结构吗?或者它实际上是在硬件级别实现的?或者是别的什么?其他芯片组的大多数汇编语言也已经实现了堆栈吗?

我知道这是一个愚蠢的问题,但实际上我很困惑.

assembly stack

71
推荐指数
5
解决办法
10万
查看次数

用于学习C程序设计的资源

来自OO背景(C#/ java)我正在寻找资源来学习如何很好地设计纯C程序.

虽然我熟悉C的语法,并且我可以编写小程序,但我不确定采用更大应用程序的方法,以及采用何种技术.你们可以推荐的任何东西.

编辑:我很高兴完全放弃OO用于C语言编程,我的兴趣是学习如何在没有OO的情况下构建程序,我想学习用C等过程语言设计程序的好方法.

c

51
推荐指数
2
解决办法
1万
查看次数

为什么堆上的内存分配比堆栈上的内存慢?

我多次被告知过这个问题.但我不知道为什么...从堆中分配内存时会涉及多少额外费用?它与硬件有关吗?它与CPU周期有关吗?如此多的猜测,但没有确切的答案......有人可以给我一些细节吗?

就像"放松"所说的那样,Heap数据结构比Stack更复杂.在我看来,一些内存空间在它开始运行时被分配给一个线程作为它的堆栈,而堆由进程内的所有线程共享.这种范例需要一些额外的机制来管理每个线程对共享堆的使用,例如垃圾收集.我对吗?

c stack memory-management

44
推荐指数
3
解决办法
1万
查看次数

为什么C#和Java会烦扰"新"运算符?

为什么新的运算符存在于C#和Java等现代语言中?它纯粹是一个自我记录的代码功能,还是它可以用于任何实际目的?

例如以下示例:

Class1 obj = new Class1();

Class1 foo()
{
    return new Class1();
}
Run Code Online (Sandbox Code Playgroud)

像Pythonesque写的那样容易阅读:

Class1 obj = Class1();

Class1 foo()
{
    return Class1();
}
Run Code Online (Sandbox Code Playgroud)

编辑:考恩澄清问题:考恩为什么选择这种语法?

language-design new-operator

17
推荐指数
4
解决办法
4044
查看次数

是否更快地访问静态或动态分配的内存?

在C中有两种分配全局数组的方法:

  1. 静态

    char data[65536];
    
    Run Code Online (Sandbox Code Playgroud)
  2. 动态

    char *data;
    …
    data = (char*)malloc(65536);  /* or whatever size */
    
    Run Code Online (Sandbox Code Playgroud)

问题是,哪种方法有更好的表现?多少钱?

理解它,第一种方法应该更快.

因为使用第二种方法,要访问数组,每次访问时都必须取消引用元素的地址,如下所示:

  1. 读取data包含指向数组开头的指针的变量
  2. 计算特定元素的偏移量
  3. 访问元素

使用第一种方法,编译器将data变量的地址硬编码到代码中,跳过第一步,因此我们有:

  1. 从编译时定义的固定地址计算特定元素的偏移量
  2. 访问数组的元素

每次存储器访问相当于大约40个CPU时钟周期,因此,使用动态分配,特别是对于不频繁的读取,与静态分配相比可以显着降低性能,因为data可以通过一些更频繁访问的变量从缓存中清除变量.相反,解除引用静态分配的全局变量的成本是0,因为它的地址已经在代码中进行了硬编码.

它是否正确?

c arrays performance

16
推荐指数
2
解决办法
3253
查看次数

C循环优化有助于最终分配

因此,对于我在计算机系统课程中的最终作业,我们需要优化这些forloops,使其比原始版本更快.使用我们的linux服务器,基本等级不到7秒,完整等级不到5秒.我在这里的代码大约需要5.6秒.我想我可能需要以某种方式使用指针来使它更快,但我不是很确定.任何人都可以提供我的任何提示或选项吗?非常感谢!

QUICKEDIT:文件必须保持50行或更少,我忽略了教师所包含的那些注释行.

#include <stdio.h>
#include <stdlib.h>

// You are only allowed to make changes to this code as specified by the comments in it.

// The code you submit must have these two values.
#define N_TIMES     600000
#define ARRAY_SIZE   10000

int main(void)
{
    double  *array = calloc(ARRAY_SIZE, sizeof(double));
    double  sum = 0;
    int     i;

    // You can add variables between this comment ...
    register double sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0, sum5 = 0, …
Run Code Online (Sandbox Code Playgroud)

c optimization loops compiler-optimization debug-mode

8
推荐指数
2
解决办法
5650
查看次数

为什么我应该在"char bigchar [1u << 31 - 1];"时使用malloc()工作得很好?

在静态数组上使用malloc(除了NULL返回失败)有什么好处?以下程序将占用我所有的ram并且只有在取消注释循环时才开始填充交换.它没有崩溃.

...

#include <stdio.h>

unsigned int bigint[ 1u << 29 - 1 ];
unsigned char bigchar[ 1u << 31 - 1 ];

int main (int argc, char **argv) {
  int i;
/*   for (i = 0; i < 1u << 29 - 1; i++) bigint[i] = i; */
/*   for (i = 0; i < 1u << 31 - 1; i++) bigchar[i] = i & 0xFF; */

  getchar();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

...

经过一些反复试验后,我发现上面是我的32位Intel机器上允许使用GCC 4.3的最大静态阵列.这是标准限制,编译器限制还是机器限制?显然我可以拥有我想要的那么多.这将是段错误,但只有当我要求(并尝试使用)时,malloc才会给我更多.

有没有办法确定静态数组是否实际分配并且可以安全使用?

编辑:我感兴趣的是为什么malloc用于管理堆而不是让虚拟内存系统处理它.显然,我可以将一个数组的大小调整到我认为我需要的大小的很多倍,并且虚拟内存系统只会保留ram所需的内容.如果我从未写过例如这些巨大数组的结束(或开头)那么程序就不会使用物理内存.此外,如果我可以写入每个位置,那么malloc除了在堆中递增指针或在同一进程中搜索先前的分配外,还做了什么呢?

编者注: 如果int是32位,则1 << …

c arrays malloc static

7
推荐指数
4
解决办法
1397
查看次数

什么是更高效的堆栈内存或堆?

可能重复:
C++哪个更快:堆栈分配或堆分配

从内存分配角度来看更有效 - 堆栈内存还是堆内存?它取决于什么?

显然,堆栈上存在动态分配与分配的开销.使用堆涉及查找可以分配内存和维护结构的位置.在堆栈上它很简单,因为您已经知道放置元素的位置.我想了解支持允许动态分配的结构的最坏情况(毫秒)开销是多少?

c++ memory compiler-construction

7
推荐指数
2
解决办法
5905
查看次数