Распределение памяти в Objective-C - PullRequest
1 голос
/ 15 декабря 2010

Может ли это утверждение когда-нибудь потерпеть неудачу?

if (@"Hello") foo();?

Другими словами, может возникнуть ситуация, когда в компиляторе не удастся выделить достаточно места для хранения литералов. Я знаю, что это звучит смешно для коротких литералов, но как насчет очень длинных.

Ответы [ 2 ]

3 голосов
/ 15 декабря 2010

номер

Литералы NSString «выделяются» во время компиляции и являются частью текстового сегмента вашей программы.

Редактировать

Чтобы ответить на другую часть вопроса, если компилятору не удастся выделить достаточно памяти для литерала, оператор if не выполнится, но компиляция будет.

Я не знаю, каков эффективный верхний предел длины строкового литерала, но он должен быть меньше NSIntegerMax unichars, потому что NSNotFound определяется как NSIntegerMax. Согласно clang docs длина в байтах строкового литерала равна unsigned int, а строковые литералы NSString представляют собой последовательности unichars.

1 голос
/ 15 декабря 2010

Я почти уверен, что если вы попытаетесь скомпилировать файл с литералом

@" ... 1TB worth of characters ... "

, компилятор потерпит неудачу.Доступный здесь стандарт C гласит, что любой совместимый компилятор должен поддерживать не менее 4095 символов на строковый литерал и т. Д. См. Раздел 5.2.4.1.Я уверен, что GCC и clang допускают намного большие литералы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...