我记得在我十几岁的时候第一次从我的书中学习记忆处理,下面的例子是:
void foo()
{
int a[1000000]; // waste of stack
// ...
}
vs
void foo()
{
int* ptr = malloc(1000000 * sizeof(int)); // much better, because the size of stack is limited
// ...
}
(是的,我听说过,有时编译器可能会将第二段代码优化为第一段)
我总是把堆栈想象成一个“固定的、有限的”内存空间,我的老书说“堆栈很小,不要浪费它”,
struct SomeStruct
{
//some fields, store ~3kb
}
List<SomeStruct> lst = new List<SomeStruct>();
for (int i = 0; i < int.MaxValue; i++)
lst.Add(new SomeStruct(/*...*/)); //somewhere we get OutOfMemory exception
所以..。我希望它使用虚拟内存并继续工作,而不是异常
我在维基百科上读到了关于mmap的内容,并尝试了这个示例。我和gcc一起编译了这个程序,并在上面运行了valgrind。
下面是valgrind的输出:
# valgrind a.out
==7018== Memcheck, a memory error detector
==7018== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==7018== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==7018== C