标签: malloc

英特尔TBB的Scalable_allocator如何工作?

什么是tbb::scalable_allocator英特尔线程构建模块实际上是引擎盖下呢?

它肯定是有效的.我刚用它来采取25%的折扣的应用程式的执行时间(并看到在CPU利用率从〜200%4核系统上增加至350%),通过改变单个std::vector<T>std::vector<T,tbb::scalable_allocator<T> >.另一方面,在另一个应用程序中,我看到它将已经很大的内存消耗加倍并将内容发送到交换城市.

英特尔自己的文档并没有给出太多帮助(例如本常见问题解答末尾的简短部分 ).在我自己去挖掘代码之前,谁能告诉我它使用了什么技巧?

更新:刚刚第一次使用TBB 3.0,并且从Scalable_allocator看到了我最好的加速.改变单一vector<int>vector<int,scalable_allocator<int> >(从测试的Debian莱尼,核2,与TBB 3.0)的从85S东西35S减少的运行时间.

c++ malloc multithreading stl tbb

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

malloc()和malloc_consolidate()中的Segfaults

当我查看gdb中的backtrace时,我的应用程序有时会主要在malloc()和malloc_consolidate()中进行段错误.

我确认机器有足够的可用内存,甚至没有开始交换.我检查了ulimits的数据分段和最大内存大小,两者都设置为'无限'.我还在valgrind下运行了应用程序,但没有发现任何内存错误.

现在我没有想到还有什么可能导致这些段错误.有任何想法吗 ?

更新: 由于我没有找到valgrind(或ptrcheck)的任何内容,可能是因为另一个应用程序正在破坏libc的内存结构,还是每个进程都有一个单独的结构?

c++ debugging malloc segmentation-fault

27
推荐指数
2
解决办法
3万
查看次数

我对C上的malloc()和calloc()非常困惑

我总是用Java编程,这可能就是为什么我对此很困惑:

在Java中我声明了一个指针:

int[] array
Run Code Online (Sandbox Code Playgroud)

并初始化它或为其分配一些内存:

int[] array = {0,1,0}
int[] array = new int[3]
Run Code Online (Sandbox Code Playgroud)

现在,在C中,这一切都让人感到困惑.起初我以为它就像宣布它一样容易:

int array[]
Run Code Online (Sandbox Code Playgroud)

并初始化它或为其分配一些内存:

int array[] = {0,1,0}
int array[] = malloc(3*sizeof(int))
int array[] = calloc(3,sizeof(int))
Run Code Online (Sandbox Code Playgroud)

除非我错了,以上所有内容都等同于Java-C,对吗?

然后,今天我遇到了一个代码,其中我发现了以下内容:

pthread_t tid[MAX_OPS];
Run Code Online (Sandbox Code Playgroud)

以及下面的一些行,没有任何初始化......

pthread_create(&tid[0],NULL,mou_usuari,(void *) 0);
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是(至少对我而言)代码有效!至少在Java中,会返回一个很好的"NullPointerException"!

所以,按顺序:

  1. 我是否正确使用所有Java-C"翻译"?

  2. 为什么该代码有效?

  3. 使用malloc(n*sizeof(int))和之间有什么区别calloc(n,sizeof(int))吗?

提前致谢

c arrays malloc calloc

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

malloc实现?

我正在尝试实现mallocfreeC,我不知道如何重用内存.我目前struct看起来像这样:

typedef struct _mem_dictionary {
    void *addr;
    size_t size;
    int freed;
} mem_dictionary;
Run Code Online (Sandbox Code Playgroud)

malloc看起来像这样:

void *malloc(size_t size) {
    void *return_ptr = sbrk(size);
    if (dictionary == NULL) 
        dictionary = sbrk(1024 * sizeof(mem_dictionary));

    dictionary[dictionary_ct].addr = return_ptr;
    dictionary[dictionary_ct].size = size;
    dictionary[dictionary_ct].freed = 1;
    dictionary_ct++;

    return return_ptr;
}
Run Code Online (Sandbox Code Playgroud)

当我释放内存时,我只会将地址标记为0(表示它是免费的).在我看来malloc,我会使用for循环来查找数组中的任何值0,然后将内存分配给该地址.我有点困惑如何实现这一点.

c malloc free memory-management

27
推荐指数
3
解决办法
4万
查看次数

命名包含malloc函数的头文件?

有人能告诉我malloc()C和C++中使用的头文件的名称吗?

c c++ malloc

27
推荐指数
1
解决办法
6万
查看次数

在C++中删除malloc的行为

int *p=(int * )malloc(sizeof(int));

delete p;
Run Code Online (Sandbox Code Playgroud)

当我们使用malloc分配内存时,我们应该使用free释放它,当我们在C++中使用new分配时,我们应该使用delete释放它.

但是如果我们使用malloc分配内存然后使用delete,那么应该会有一些错误.但是在上面的代码中,C++中没有错误或警告.

此外,如果我们使用new进行反向和分配并使用free进行释放,那么也没有错误或警告.

为什么会这样?

c++ malloc delete-operator

27
推荐指数
3
解决办法
2万
查看次数

你有没有通过使用boost :: pool获得显着的加速?

我曾经在boost :: pool中玩了几次,在我看来我正在用很多对象"churn"认真地敲打堆.通常我已经使用过boost::object_pool,或者boost::pool_alloc作为STL模板参数.然而,结果总是表明性能几乎没有变化,或者显着恶化.

我很想知道它有任何成功的故事.

我应该在分析输出中寻找什么样的东西,这可能表明boost :: pool可能会有所帮助?

实际上很难改进好的旧malloc吗?

c++ malloc optimization boost memory-management

26
推荐指数
3
解决办法
9015
查看次数

一个malloc在C中有多大?

我在C中有一个malloc,它是26901 ^ 2*sizeof(double)

这让我想到这里最大的价值是什么?

另外,定义宏来访问这个2D数组有什么问题吗?

 #define DN(i,j) ((int)i * ny + (int)j)
Run Code Online (Sandbox Code Playgroud)

因为这对我来说似乎不起作用 - 或者我至少不确定它是不是.我无法弄清楚如何在宏上进行全视图潜水,告诉我A [DN(indx,jndx)]实际上是在看什么.

c malloc macros totalview

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

在realloc()之前需要malloc()吗?

因为我读过realloc将作为malloc,如果指向的大小是0,我使用它没有malloc(),前提是指针是静态的,全局的,或者如果是自动的话显式设置为NULL.

但是,我注意到很多程序员试图设置它或将其设置为malloc(1).需要它吗?

c malloc memory-management alloc

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

我可以假设用较小的大小调用realloc可以释放余数吗?

让我们考虑一下这段很短的代码片段:

#include <stdlib.h>

int main()
{
    char* a = malloc(20000);
    char* b = realloc(a, 5);

    free(b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在阅读了realloc的手册页后,我不完全确定第二行会导致释放19995个额外字节.引用手册页:The realloc() function changes the size of the memory block pointed to by ptr to size bytes.但是根据该定义,我可以确定其余的将被释放吗?

我的意思是,指向的块b肯定包含5个空闲字节,所以对于懒惰的顺从分配器是否足以让realloc行不做任何事情?

注意:我使用的分配器似乎释放了19 995个额外字节,如valgrind在注释掉free(b)行时所示:

==4457== HEAP SUMMARY:
==4457==     in use at exit: 5 bytes in 1 blocks
==4457==   total heap usage: 2 allocs, 1 frees, 20,005 bytes allocated
Run Code Online (Sandbox Code Playgroud)

c malloc free realloc

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