iPhone的堆栈大小是固定的吗?

时间:2015-06-19 03:10:08

标签: ios iphone stack

当我尝试调整线程的堆栈大小时:

- (void)testStack:(NSInteger)n {
    NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(dummy) object:nil];
    NSUInteger size = 4096 * n;
    [thread setStackSize:size];
    [thread start];
}

- (void)dummy {
    NSUInteger bytes = [[NSThread currentThread] stackSize];
    NSLog(@"%@", @(bytes));
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    for (NSInteger i = 126; i <= 130; i++) {
        [self testStack:i];
    }
    return YES;
}

在输出中,大小不会改变:

2015-06-19 11:05:06.912 Stack[52982:2082454] 524288
2015-06-19 11:05:06.913 Stack[52982:2082457] 524288
2015-06-19 11:05:06.913 Stack[52982:2082456] 524288
2015-06-19 11:05:06.913 Stack[52982:2082458] 524288
2015-06-19 11:05:06.913 Stack[52982:2082455] 524288

是否已修复iPhone堆栈大小?

P.S。我正在测试iPhone 6 Plus中的上述调试模式。

更新:在MacBook上的模拟器中运行时可以调整堆栈:

2015-06-19 11:25:17.042 Stack[1418:427993] 528384
2015-06-19 11:25:17.042 Stack[1418:427994] 532480
2015-06-19 11:25:17.042 Stack[1418:427992] 524288
2015-06-19 11:25:17.042 Stack[1418:427991] 520192
2015-06-19 11:25:17.042 Stack[1418:427990] 516096

2 个答案:

答案 0 :(得分:4)

堆栈大小在设备上有限,在大多数情况下,iPhone OS上的主线程不能超过1MB,也不能缩小。

辅助线程允许的最小堆栈大小为16 KB,堆栈大小必须为4 KB的倍数。在创建线程时,您的进程空间中会留出此内存空间,但在需要之前不会创建与该内存关联的实际页面。

答案 1 :(得分:2)

实际上你可以设置它。我不确定这是否会因iOS 10而改变,但在iOS 10.2.1上这确实有效。唯一的限制是堆栈大小必须是4kb的倍数。

pthread_attr_t tattr;
int ret = pthread_attr_init ( &tattr ) ;
size_t size;
ret = pthread_attr_getstacksize(&tattr, &size);
printf ( "Get: ret=%d,size=%zu\n" , ret , size ) ;

size = 4096 * 512 ;
ret = pthread_attr_setstacksize(&tattr, size);
int ret2 = pthread_attr_getstacksize(&tattr, &size);
printf ( "Set & Get: ret=%d ret2=%d,size=%zu\n" , ret , ret2 , size ) ;