程序员倾向于通过首先编写更多代码来解决每个问题。然后必须对其进行维护。每个问题都不是钉子...
更多代码在这里并不是最简单、最有效的解决方案。更多的代码也可能产生更慢的可执行文件。
堆栈内存就是内存——它与堆内存没有什么不同。它只是由进程以不同的方式管理,并且受到不同的资源限制。一个进程是在其堆栈上使用 1 GB 内存,还是从其堆中使用 1 GB 内存,对于操作系统来说并没有真正的区别。
在这种情况下,堆栈大小限制可能是人为的配置设置。在 Linux 系统上,可以为 shell 及其子进程重置堆栈大小限制:
bash-4.1$ ulimit -s unlimited
bash-4.1$ ulimit -s
unlimited
bash-4.1$
有关更多详细信息,请参阅此问题及其答案。
所有符合 POSIX 的系统都应该具有类似的功能,因为堆栈大小限制是POSIX 标准的资源限制。
此外,您可以很容易地运行具有任意大堆栈的线程:
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <stdio.h>
void *threadFunc( void *arg )
{
double array[1024][1024][64];
memset( array, 0, sizeof( array ) );
return( NULL );
}
int main( int argc, char **argv )
{
// create and memset the stack lest the child thread start thrashing
// the machine with "try to run/page fault/map page" cycles
// the memset will create the physical page mappings
size_t stackSize = strtoul( argv[ 1 ] ? argv[ 1 ] : "1073741824",
NULL, 0 );
void *stack = mmap( 0, stackSize, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANON, -1, 0 );
memset( stack, 0, stackSize );
// create a large stack for the child thread
pthread_attr_t attr;
pthread_attr_init( &attr );
pthread_attr_setstacksize( &attr, stackSize );
pthread_attr_setstackaddr( &attr, stack );
pthread_t tid;
pthread_create( &tid, &attr, threadFunc, NULL );
void *result;
pthread_join( tid, &result );
return( 0 );
}
已省略错误检查。
如果您ulimit -s unlimited
在运行已编译的程序之前运行(当然,如果机器有足够的虚拟内存......),这也有效:
#include <string.h>
int main( int argc, char **argv )
{
double array[1024][1024][64];
memset( array, 0, sizeof( array ) );
return( 0 );
}