标签: malloc

在NUMA上独立运行malloc/memcpy函数吗?

在尝试提高我在非NUMA /标准PC上的应用程序的速度时,我总是发现瓶颈是调用,malloc()因为即使在多核机器中它也是所有内核之间的共享/同步.

我有一台使用Linux和C的NUMA架构的PC,我有两个问题:

  1. 在NUMA机器中,由于每个内核都有自己的内存,因此可以malloc()在每个内核/内存上独立执行而不会阻塞其他内核吗?
  2. 在这些架构中,如何进行调用memcpy()?这可以在每个核心上独立调用,或者在核心中调用它会阻止其他核心吗?我可能错了,但我记得也memcpy()遇到了同样的问题,malloc()即当一个核心使用它时,其他核心必须等待.

c memory malloc memcpy numa

9
推荐指数
1
解决办法
1732
查看次数

mmap如何工作?

我正在研究Linux中需要来自硬盘的mmap文件的程序,但我有一个问题,是什么能使它失败.就像所有的内存都碎片化,每个只有200M,但我想将文件mmap到1000M的内存,它会成功吗?

还有一个问题,Linux中是否有任何工具可以像Windows中的某些工具一样重新收集内存,例如xp的内置工具.

谢谢.

linux memory malloc mmap

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

Malloc函数(动态内存分配)在全局使用时导致错误

#include<stdio.h>
#include<string.h>
char *y;
y=(char *)malloc(40); // gives an error here
int main()
{
    strcpy(y,"hello world");
}
Run Code Online (Sandbox Code Playgroud)
error: conflicting types for 'y'
error: previous declaration of 'y' was here
warning: initialization makes integer from pointer without a cast
error: initializer element is not constant
warning: data definition has no type or storage class
warning: passing arg 1 of `strcpy' makes pointer from integer without cast
Run Code Online (Sandbox Code Playgroud)

现在真正的问题是,我们不能在全球范围内进行动态内存分配吗?为什么在全局使用malloc时会显示错误?如果我把malloc语句放在main函数或其他函数中,代码就没有错误.为什么会这样?

#include<stdio.h>
#include<string.h>
char *y;
int main()
{
    y=(char *)malloc(40); 
    strcpy(y,"hello world");
}
Run Code Online (Sandbox Code Playgroud)

c malloc global-variables dynamic-memory-allocation

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

malloc +自动引用计数?

如果我使用malloc和自动引用计数,我还需要手动释放内存吗?

int a[100];
int *b = malloc(sizeof(int) * 100);
free(b);
Run Code Online (Sandbox Code Playgroud)

malloc objective-c automatic-ref-counting

9
推荐指数
2
解决办法
6985
查看次数

malloc结构指针数组与结构数组

有什么区别

struct mystruct *ptr = (struct test *)malloc(n*sizeof(struct test));
Run Code Online (Sandbox Code Playgroud)

struct mystruct **ptr = (struct test *)malloc(n*sizeof(struct test *));
Run Code Online (Sandbox Code Playgroud)

他们都工作正常,我只是好奇两者之间的实际差异.第一个是否分配了一个结构数组,而第二个是结构指针数组?另一种方式?另外,哪一个内存占用较小?

c arrays malloc struct pointers

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

Char ** 用法和打印

在 C 中,我使用 achar **来保存一系列字符串。

这是我的代码:

char ** c;
//now to fill c with data ????

//cannot change:
printf ("%*s%s", 0, "", *c);
while (*++w)
    printf (" %s", *c);
Run Code Online (Sandbox Code Playgroud)

我不知道如何填充c数据。正确的方法是什么?我无法更改 3 条打印行,因为它们位于外部函数中。

c malloc double-pointer multidimensional-array

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

我们为什么要转换malloc的返回值?

有人可以向我解释为什么一些程序员在malloc前使用(char*)?我知道它返回void但为什么我要它只返回char内存?对不起,我只是编程的新手.谢谢

c malloc

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

在Swift中导入C头

我无法导入malloc/malloc.h用于malloc_size()查看对象的大小.它是否可用Swift或我做错了:import malloc/malloc.h

malloc ios swift

9
推荐指数
2
解决办法
4562
查看次数

我应该在 C 中的 basename/dirname 之后释放 strdup 指针吗?

我想使用 POSIX 的basename功能(而不是 GNU 的)。

从手册页:

dirname() 和 basename() 都可以修改 path 的内容,因此在调用这些函数之一时可能需要传递一个副本。

这些函数可能会返回指向静态分配的内存的指针,这些内存可能会被后续调用覆盖。 或者,它们可能会返回指向 path 某些部分的指针,以便在不再需要函数返回的指针之前,不应修改或释放 path 引用的字符串。

它还说:

返回值
dirname() 和 basename() 都返回指向以空字符结尾的字符串的指针。(不要将这些指针传递给 free (3)。)

因此,该示例建议如下:

例子

       char *dirc, *basec, *bname, *dname;
       char *path = "/etc/passwd";

       dirc = strdup(path);
       basec = strdup(path);
       dname = dirname(dirc);
       bname = basename(basec);
       printf("dirname=%s, basename=%s\n", dname, bname);
Run Code Online (Sandbox Code Playgroud)

strdupstrndup)手册页说:

新字符串的内存通过 malloc(3) 获得,并且可以通过 free(3) 释放。

所以问题是:我应该释放 dirc 和 basec(按照strdup)还是不释放(按照basename)?

c memory string malloc strdup

9
推荐指数
1
解决办法
3105
查看次数

如果内存池比 malloc 快,为什么 malloc 不在幕后使用它们?

我一直听说内存池在分配内存时可以显着提高性能..那么为什么传统的 malloc 实现不以某种方式使用它们呢?

我知道部分原因是内存池使用固定大小的内存块,但似乎有些没有,他们唯一需要的是提前获取一点额外的内存。有没有一种方法可以将它们充分概括用于此类目的?

c c++ malloc memory-pool

9
推荐指数
1
解决办法
520
查看次数