Смертельный раздел «слишком большой, не может закодировать» адрес памяти в gcc (приложение для iPhone) - PullRequest
2 голосов
/ 06 января 2012

Я разработал приложение MonoTouch для iPhone. В настоящее время он работает, анализируя большое количество XML-данных, которые генерируют все мои объекты. Я попытался улучшить скорость запуска, сериализовав эти объекты и сохранив их в базе данных SQL. Но это было на самом деле медленнее. Вместо этого я написал программу, которая предварительно анализирует этот xml и, в свою очередь, записывает файлы классов, которые можно просто скомпилировать и создать экземпляры объектов во время выполнения.

Это работает и значительно увеличивает скорость, , но Я могу скомпилировать только часть набора до того, как компилятор gcc выйдет из строя: я получаю

"ФАТАЛЬНО: слишком большой раздел, невозможно кодировать адрес__"

ошибка, когда он не может закодировать адрес в 24-битную запись рассеянного перемещения

Может кто-нибудь пролить свет на это для меня, пожалуйста? Я не особенно разбираюсь в компиляторах, но мне хотелось бы знать, возможно ли это, или я что-то не так делаю.

Каждый отдельный класс компилируется, только когда я компилирую ряд из них, он терпит неудачу.
Не существует определенного количества классов, которые вызывают его сбой, ни длины функции, вместо этого это, кажется, вызвано огромным размером кода приложения.

Спасибо за ваше время, Лиам

1 Ответ

1 голос
/ 09 января 2012

Это уже известная проблема .

Что вы можете сделать, это попытаться уменьшить окончательный размер вашего приложения. Есть несколько способов уменьшить размер приложения:

  • Включить связывание (свойства проекта - iPhone Build - Поведение компоновщика: связать все сборки)

  • Избегайте обобщений с типами значений, так как это приведет к тому, что код будет генерироваться один раз для каждого типа значения (поэтому, если вы, например, используете List<int> и List<long>, код списка будет генерироваться дважды - для большие общие типы это может иметь большое значение). Обратите внимание, что все типы классов будут совместно использовать код (поэтому List<string> и List<object> будут использовать один и тот же код), поэтому используйте дженерики для типов классов свободно.

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