Tag: 内存管理

将多分支树复制到GPU内存

我有一个节点树,我试图将其复制到GPU内存。 Node看起来像这样: struct Node { char *Key; int ChildCount; Node *Children; } 我的复制function如下所示: void CopyTreeToDevice(Node* node_s, Node* node_d) { //allocate node on device and copy host node cudaMalloc( (void**)&node_d, sizeof(Node)); cudaMemcpy(node_d, node_s, sizeof(Node), cudaMemcpyHostToDevice); //test printf(“ChildCount of node_s looks to be : %d\n”, node_s->ChildCount); printf(“Key of node_s looks to be : %s\n”, node_s->Key); Node *temp; […]

循环内的堆栈分配

在C中,当你编写这样的代码时: void some_function(void) { while (something) { char buf[4096]; … } } 在调用函数时是否会发生buf的分配? 或者是否为循环的每次迭代都会进行单独的分配? 如果我把buf的声明放在循环之外(即在函数的开头),会有任何性能提升吗?

自定义内存分配器用于实模式DOS .COM(独立式) – 如何调试?

首先是一个小背景:在这篇博文上磕磕绊绊,我了解到有可能用GNU链接器创建DOS .COM文件,它甚至不是火箭科学。 使用clang和-m16开关(通过相应地为32位指令加前缀来创建实模式兼容的32位代码),这非常好。 所以我有想法尝试实现足够的运行时来获得我最近写的一个小诅咒游戏 ,编译成.COM并在实模式 DOS 下运行。 游戏足够小,所以压缩64KB的所有内容(文本,数据,bss,堆,堆栈)似乎是可行的。 当然,它使用malloc() 。 所以我不得不想出自己的实现。 这就是它的样子: typedef unsigned short size_t; /* from stddef.h */ typedef struct hhdr hhdr; struct hhdr { void *next; int free; }; extern char _heap; static char *hbreak = &_heap; static hhdr hhead = { &_heap, 0 }; static void *newchunk(size_t size) { char *stack; […]

C中的多维数组

这与我在这个问题中的答案的评论有关: 如何从1d中转出2d数组? 所以,请考虑以下代码段: int M = 5; int N = 5; int** theArray = (int**) malloc(M*sizeof(int*)); for (int i = 0; i < M; i++) { theArray[i] = (int*) malloc(N*sizeof(int)); for(int j = 0 ; j < N; j++) { theArray[i][j] = i+j; printf("%d ", theArray[i][j]); } printf("\n"); } for (int k = 0; k […]

我是否可以通过一个进程中的PTE指示物理内存碎片在其他进程中创建适当的PTE?

当我们在Linux中使用函数mmap (,,, MAP_ANON | MAP_SHARED); 然后,对于进程之间的碎片物理内存(分配)的相同区域,分配虚拟内存页(PTE)。 即这些PTE从一个进程的页表复制到另一个进程的页表(具有相同的物理地址分配内存片段序列),这是真的吗? 但是mmap ()需要在fork ()之前完成。 如果我们已经有两个工作进程(即fork () ),那么我们需要为mmap()使用一个文件 。 哪两个函数用于复制两个已经建立的进程之间的PTE机制来创建共享内存? 我可以使用PTE / SGL(分散 – 收集列表)指示已经分配的物理内存片段,通过使用linux-kernel在其他进程中创建适当的PTE,以及如何做到这一点? 我想了解mmap()在较低级别的工作原理。

unit testingC库,内存管理

我正在开发一个相当大的C库,现在没有任何测试。 由于API开始是最终的,我想开始编写unit testing。 几乎所有的函数都作用于第一个参数(一个结构)。 unit testing的朴素方法是使预函数调用结构处于已知状态,调用函数,然后将预调用结构与预期结果进行比较。 现在这适用于由标量类型组成的结构,但至于分配的内存,我想知道你正在使用什么样的方法。 例如,想象一下图像结构,当你这样做时: CreateImage(&img, x, y); 你希望img-> x是x,img-> y是y而img->像素是一个指向大到足以容纳x * y * sizeof(pixel)东西的指针。 检查前两个是微不足道的,但img->像素怎么样? 我不是要检查malloc调用是否成功,因为我可以重载 malloc,但我想知道malloc是否被正确调用。 在以下情况下,这一点尤为重要: CreateImage(*img, x, y) { img->x = x; img->y = y; /* do something, dhoo, that something is broken and modify x or y */ img->pixels = malloc(x * y * sizeof(pixel)); /* wrong […]

Calloc里面的function

看看刚刚被问过的这个问题: 对静态变量指针的不便会做这样的事情被认为是不好的做法,那么呢? char* strpart(char* string, int start, int count) { char* strtemp; int i = 0; int j = 0; int strL = strlen(string); if ( count == 0 ) { count = strL; } strtemp = (char*) calloc((count + 1), sizeof(char)); for ( i = start; i < (start+count); i++ ) { strtemp[j] = […]

如何释放已用于C中变量的内存?

我如何在C中释放我用于变量(例如长字符串)的内存?

如何从1d中转出2darrays?

要访问我使用的任何元素*(Ptr + i) 。 有没有办法将2D数组放入分配的内存,以便使用array[i][j]访问任何元素? 这是代码: #include #include int main() { int *Ptr; Ptr = malloc(M*N*sizeof(int)); for (i = 0; i <= M * N; i++) *(Ptr + i) = 1 + rand()%10; return 0; }

我可以避免使用现代操作系统在C中释放已分配的内存吗?

我正在使用Visual C ++ 2010进行C项目。 我在main()中有以下代码: ARRAY2D a; arr2_init(&a, 5, 5); /* 5×5 dynamic, multi-demensional array (of type int) */ arr2_release(&a); 我不确定我是否需要最后一行。 在现代操作系统的程序结束时,我可以省略arr2_release()吗? 我正在使用Windows 7。