在尝试提高我在非NUMA /标准PC上的应用程序的速度时,我总是发现瓶颈是调用,malloc()因为即使在多核机器中它也是所有内核之间的共享/同步.
我有一台使用Linux和C的NUMA架构的PC,我有两个问题:
malloc()在每个内核/内存上独立执行而不会阻塞其他内核吗?memcpy()?这可以在每个核心上独立调用,或者在核心中调用它会阻止其他核心吗?我可能错了,但我记得也memcpy()遇到了同样的问题,malloc()即当一个核心使用它时,其他核心必须等待.我正在研究Linux中需要来自硬盘的mmap文件的程序,但我有一个问题,是什么能使它失败.就像所有的内存都碎片化,每个只有200M,但我想将文件mmap到1000M的内存,它会成功吗?
还有一个问题,Linux中是否有任何工具可以像Windows中的某些工具一样重新收集内存,例如xp的内置工具.
谢谢.
#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) 如果我使用malloc和自动引用计数,我还需要手动释放内存吗?
int a[100];
int *b = malloc(sizeof(int) * 100);
free(b);
Run Code Online (Sandbox Code Playgroud) 有什么区别
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 中,我使用 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 条打印行,因为它们位于外部函数中。
有人可以向我解释为什么一些程序员在malloc前使用(char*)?我知道它返回void但为什么我要它只返回char内存?对不起,我只是编程的新手.谢谢
我无法导入malloc/malloc.h用于malloc_size()查看对象的大小.它是否可用Swift或我做错了:import malloc/malloc.h
我想使用 POSIX 的basename功能(而不是 GNU 的)。
从手册页:
dirname() 和 basename() 都可以修改 path 的内容,因此在调用这些函数之一时可能需要传递一个副本。
这些函数可能会返回指向静态分配的内存的指针,这些内存可能会被后续调用覆盖。 或者,它们可能会返回指向 path 某些部分的指针,以便在不再需要函数返回的指针之前,不应修改或释放 path 引用的字符串。
它还说:
返回值
dirname() 和 basename() 都返回指向以空字符结尾的字符串的指针。(不要将这些指针传递给 free (3)。)
因此,该示例建议如下:
例子
Run Code Online (Sandbox Code Playgroud)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);
在strdup(strndup)手册页说:
新字符串的内存通过 malloc(3) 获得,并且可以通过 free(3) 释放。
所以问题是:我应该释放 dirc 和 basec(按照strdup)还是不释放(按照basename)?
我一直听说内存池在分配内存时可以显着提高性能..那么为什么传统的 malloc 实现不以某种方式使用它们呢?
我知道部分原因是内存池使用固定大小的内存块,但似乎有些没有,他们唯一需要的是提前获取一点额外的内存。有没有一种方法可以将它们充分概括用于此类目的?