Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在Obj-C中,OSX上的自动存储有什么限制?为什么我需要使用malloc而不是普通的自动阵列来处理大型阵列?_Objective C_Arrays_Macos - Fatal编程技术网

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
进行检查。非常感谢您的详细回答--我现在知道了堆栈大小限制!非常感谢您的详细回答--我现在知道了堆栈大小限制!