我有一个单线程的嵌入式应用程序,可以分配和释放大量的小块(32-64b).基于缓存的分配器的完美方案.虽然我可以尝试写一个,但这可能是浪费时间,而不是像一些已经在前线的解决方案那样经过测试和调整.
那么我可以用于这种情况的最佳分配器是什么?
注意:我在系统中使用Lua虚拟机(这是80%以上的分配的罪魁祸首),所以我不能轻易地重构我的代码以使用堆栈分配来提高分配性能.
在32位操作系统下,分配给任何一个程序的最大内存有限,Mathematica优雅地终止内核并返回最大内存分配错误.
然而,在64位操作系统上,Mathematica将自由使用所有可用内存并使系统停止运行.因此,限制内存使用的正确方法是什么?可以使用MemoryConstrained组合$Pre或CellEvaluationFunction但我不想为此目的绑定其中任何一个,或者必须修改现有用途以合并此功能.
是否存在另一种全局限制内存使用的方法,例如内核标志或系统$ Option?
我收到此错误,不知道该怎么办:
AppName(3786,0xa0810540) malloc: *** mmap(size=16777216) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Run Code Online (Sandbox Code Playgroud)
如果我设置断点到发生错误的那一行,我不知道我要专门搜索什么.在仪器中,我检查了分配,并且值增加到所有分配的14,5 GB.
有人可以帮我吗?
brush51
编辑1:
更多信息:
- 我在模拟器中尝试这个,而不是在iOS设备上.
- 这就是所有的输出(我得到这个错误的次数更多). - 此行发生错误:
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *fetchREntitySetsCards = [[[NSFetchRequest alloc] init] autorelease];
//NSFetchRequest *fetchREntityRelCardsAnswersNotes = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entitySetsCards = [NSEntityDescription entityForName:@"EntitySetsCards" inManagedObjectContext:context];
//NSEntityDescription *entityRelCardsAnswersNotes = [NSEntityDescription entityForName:@"EntityRelCardsAnswersNotes" inManagedObjectContext:context];
setEntity:entityCard];
[fetchREntitySetsCards setEntity:entitySetsCards];
//[fetchREntityRelCardsAnswersNotes setEntity:entityRelCardsAnswersNotes];
NSArray *fetchedObjSetsCards = [context executeFetchRequest:fetchREntitySetsCards error:&error];
//The error is here--->
//NSArray …Run Code Online (Sandbox Code Playgroud) 我承认所有这三个都有不同的含义.但是,我不明白每种情况适用于哪些特定情况.任何人都可以分享这些例子吗?谢谢.
malloc(sizeof(int))
malloc(sizeof(int *))
(int *)malloc(sizeof(int))
Run Code Online (Sandbox Code Playgroud) 不确定如何标题,但问题是:
我听说程序员在程序开始时分配大部分连续内存,然后在必要时将其处理掉.这与每次需要内存时简单地访问操作系统形成对比.我听说这会更快,因为它可以避免不断向操作系统询问连续的内存块的成本.
我相信JVM会这样做,维护自己的内存部分,然后从中分配对象.
我的问题是,如何实际实现这一点?
谢谢,dragonwrenn
我并不真正理解C中的一些基本内容,比如动态分配数组数组.我知道你可以这样做:
int **m;
Run Code Online (Sandbox Code Playgroud)
为了声明一个二维数组(随后将使用一些*alloc函数分配).也可以通过这样做"轻松"访问它*(*(m + line) + column).但是我应该如何为该数组中的元素赋值?使用gcc时,以下语句m[line][column] = 12;因分段错误而失败.
任何文章/文档将不胜感激.:-)
我正在阅读Mac上的 Mark Dalrymple的Learn Objective-C(仅在Protocols的章节,所以还是相对较新的)并试图找出一些东西:
你为什么要用自己的名字引用一个类?如果我上课了Foo,为什么我要写,比方说,
[[Foo alloc] init]
Run Code Online (Sandbox Code Playgroud)
并不是
[[[self class] alloc] init]
Run Code Online (Sandbox Code Playgroud)
如果我有一个子类Bar,第一个选项不会使我无效
[[Bar alloc] init]
Run Code Online (Sandbox Code Playgroud)
而第二种选择会允许吗?第一种选择什么时候会更好?
我一直试图找出什么时候在堆栈上分配的东西,我无法弄清楚如何在堆栈上分配数组(或者更确切地说是其中的值);
在这个例子中:
public void foo()
{
int bar[] = new int [10];
}
Run Code Online (Sandbox Code Playgroud)
将在堆上分配10个int结构,只有指向它们的指针才会在堆栈上,对吗?
如何使固定大小的数组进入堆栈?如果我使用的是我定义的结果怎么办?
如果我想将数组大小作为参数传递给函数怎么办?
据我所知,当调用函数时,如果在调用函数时已知大小,则在堆栈上获取任意大小的数组应该没有问题.
我是否应该为此烦恼?据我所知,在堆栈上获取这个固定大小的数组会提高性能,因为没有完成堆分配.
在C中,对于库来说,允许用户通过使用函数的全局函数指针来自定义内存分配是很简单的,该函数应该malloc()与应该表现类似的函数类似free().例如,SQLite使用这种方法.
C++使事情变得复杂,因为分配和初始化通常是融合的.从本质上讲,我们希望获得被覆盖的行为,operator new并且operator delete只有一个库,但实际上没有办法实现(我相当肯定,但不是100%).
如何在C++中完成?
这是对new使用函数复制表达式的某些语义的东西的第一次尝试Lib::make<T>.
我不知道这是否有用,但只是为了好玩,这是一个更复杂的版本,也试图复制new[]表达式的语义.
这是一个面向目标的问题,所以我不一定要寻找代码审查.如果有更好的方法,只需这样说并忽略链接.
(通过"allocator"我只是指分配内存的东西.我不是指STL分配器概念,甚至不是为容器分配内存.)
为什么这可能是可取的:
这是一篇来自Mozilla dev的博客文章,他们认为图书馆应该这样做.他给出了几个允许库用户自定义库分配的C库示例.我查看了其中一个示例SQLite的源代码,并看到此功能也在内部用于通过故障注入进行测试.我不是在编写任何需要像SQLite一样防弹的东西,但它似乎仍然是一个明智的想法.如果不出意外,它允许客户端代码弄清楚"哪个库正在占用我的记忆以及何时?".
假设我非常防御地编写代码,并且总是从我调用的所有函数中检查返回类型.
所以我喜欢:
char* function() {
char* mem = get_memory(100); // first allocation
if (!mem) return NULL;
struct binder* b = get_binder('regular binder'); // second allocation
if (!b) {
free(mem);
return NULL;
}
struct file* f = mk_file(); // third allocation
if (!f) {
free(mem);
free_binder(b);
return NULL;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
注意free()事情失控的速度有多快.如果某些功能失败,我必须先释放每一个分配.代码很快变得丑陋,我所做的就是复制粘贴一切.我成为了一个复制/粘贴程序员,更糟糕的是,如果有人在其间添加一个声明,他必须修改下面的所有代码来调用free()他的添加.
经验丰富的C程序员如何解决这个问题?我无法解决任何问题.
谢谢,Boda Cydo.