Objective c 在Obj-C中,OSX上的自动存储有什么限制?为什么我需要使用malloc而不是普通的自动阵列来处理大型阵列?
今天我遇到了一个奇怪的错误,我仍然不明白:Objective c 在Obj-C中,OSX上的自动存储有什么限制?为什么我需要使用malloc而不是普通的自动阵列来处理大型阵列?,objective-c,arrays,macos,Objective C,Arrays,Macos,今天我遇到了一个奇怪的错误,我仍然不明白: long long N = 2000; long long N2 = N*N; long long *s = malloc(sizeof(long long)*N2); // create array // populate it for (long long k = 1; k <= 55; k++) { long N=2000; 长N2=N*N; long-long*s=malloc(sizeof(long-long)*N2);//创建数组
long long N = 2000;
long long N2 = N*N;
long long *s = malloc(sizeof(long long)*N2); // create array
// populate it
for (long long k = 1; k <= 55; k++) {
long N=2000;
长N2=N*N;
long-long*s=malloc(sizeof(long-long)*N2);//创建数组
//填充它
对于(long long k=1;k自动局部变量在堆栈上分配;根据,OSX进程主线程的默认堆栈大小为8MB,其他线程的默认堆栈大小小于8MB。您可以尝试链接器选项或注释中给出的setrlimit
解决方案,但C传统是将堆用于任何大型分配。自动局部变量是允许的根据,OSX进程主线程的默认堆栈大小为8MB,其他线程的默认堆栈大小为8MB。您可以尝试链接器选项或注释中给出的设置限制解决方案,但C传统是使用堆进行任何大的分配。您的第一个示例从堆中分配内存,堆位于e“数据段”,您的第二个在堆栈上分配内存,该堆栈位于“堆栈段”中。每一个都有不同的大小限制
根据,默认堆栈段大小限制为8 MiB。您可以通过在终端中运行ulimit-a
进行双重检查:
:; ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 256
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) unlimited
如您所见,堆栈大小限制为8192 KiB=8 MiB
上面链接的技术问答描述了一些增加堆栈大小限制的方法。不以root身份运行时,可以增加堆栈大小限制的最大值是64 MiB
如果创建线程,每个线程都有自己的堆栈。根据Q&A,如果使用NSThread
API,可以将线程的堆栈大小设置为1 GiB。第一个示例从堆中分配内存,该堆位于“数据段”,第二个示例在堆栈上分配内存,该堆栈位于“堆栈段”.每一个都有不同的尺寸限制
根据,默认堆栈段大小限制为8 MiB。您可以通过在终端中运行ulimit-a
进行双重检查:
:; ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 256
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) unlimited
如您所见,堆栈大小限制为8192 KiB=8 MiB
上面链接的技术问答描述了一些增加堆栈大小限制的方法。不以root身份运行时,可以增加堆栈大小限制的最大值是64 MiB
如果创建线程,每个线程都有自己的堆栈。根据Q&A,如果使用NSThread
API,则可以将线程的堆栈大小设置为1 GiB。默认情况下堆栈为8 MB。使用ulimit-s
进行检查。默认情况下堆栈为8 MB。使用ulimit-s
进行检查。非常感谢您的详细回答--我现在知道了堆栈大小限制!非常感谢您的详细回答--我现在知道了堆栈大小限制!