2015-05-24 7 views
1

Я создал многоплатформенное приложение, использующее FLTK, которое использует функциональность сериализации ускоренного текста, чтобы обеспечить переносимую кросс-платформенную документацию, сохраняющую функциональность. (Если это плохая идея: слишком поздно я боюсь!).ускорение десериализации текста сбой на 32-битной оконной машине

Это отлично работает на Mac и на машине Windows, на которой я скомпилировал ее. Однако я использовал скомпилированный двоичный файл на более низкоразмерной машине Windows и, несмотря на то, что он работал отлично со всеми другими функциями, при открытии файлов сохранения (т. Е. При десериализации) программа сбой.

Глядя на использовании памяти в диспетчере задач на нижней specced машины Windows, и на мониторе активности я заметил это различного поведение

Окно: использования памяти является проблемой, она продолжает подниматься, пока программа не использует вокруг 800 Мб ОЗУ, а затем сбой программы

Mac: Использование памяти для одного и того же скомпилированного кода при десериализации одного и того же файла достигает 40 Мб.

Бинарный файл Windows - это Win32 (32 бит), и я проверил такое же нормальное рабочее поведение как в 64-битной, так и в 32-битной версиях Mac. Весь код был связан с использованием статических библиотек (кроме случаев, когда это невозможно, например, для CRT в Mac OS).

Зачем использовать тот же самый код с использованием функции boost, которая содержится в файле только заголовка, приводит к этому обратному использованию памяти на компьютере Windows (он отлично работал на машине с более высоким разрешением, хотя я не отслеживал использование памяти), в то время как все остальные функции программы работают нормально?

И что я могу сделать?

Спасибо.

+0

Чтобы сузить область поиска, попробуйте просто простую консольную программу, чтобы проверить сериализацию boost, аналогичную тому, что вы написали в GUI-версии. Это также утечка памяти? – cup

ответ

0

Я подозреваю, что используемые типы просто не совпадают.

E.g. на 32-битном компиляторе (или целевая архитектура, действительно) long обычно 32 бита (4 байт).

В 64-битном компиляторе long обычно в два раза больше. Это может вас тронуть, даже если вы использовали текстовое представление.

Рассмотрите, что происходит, когда число считывается, которое превышает int32_t. Это может привести к большому отрицательному числу. Теперь, интерпретировать это, как size_t и вы получите поломку: это приведет к еще больший размер, и если код делает распределение, чтобы соответствовать ...

Итак, первая вещь:

  1. Проверьте все свои типы данных, чтобы узнать, не являются ли они независимыми от архитектуры. Например. используя

    #include <cstdint> 
    

    Spell или ваши типы, как int32_t или uint64_t. Никогда не зависеть от настроек по умолчанию.

  2. После того, как это сделано, следует использовать переносной реализации архива EPA здесь: https://epa.codeplex.com/

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

+0

Оба хороших момента, спасибо, но пока не удалось реализовать/проверить. Просто проверяя, что версия Windows *, которая работала * на машине с более высоким разрешением, была скомпилирована для 32-битной целевой архитектуры, поэтому я немного не понимаю, почему 32-разрядная версия будет работать только на 32-битной машине? Что в стороне, учитывая, что я хочу переносимость, должен ли я изменить все на int32_t (в отличие от int64_t)? – user3353819

+0

int64_t является вполне допустимым типом в 32-битных системах. Это может быть не так эффективно, потому что это превышает собственный размер регистра. Однако, конечно, область приложения определяет, какой диапазон интегральных значений требуется. Машина никогда не приходит в это вообще. Это будет оптимизация. Помните [что они говорят о преждевременной оптимизации] (http://c2.com/cgi/wiki?PrematureOptimization). – sehe

+0

Я заменяю все на int32_t, но я сомневаюсь, что сериализация текста идентична до изменения. Я думаю, что я не сделал что-то ясно: авария на нижней 32-битной машине, использующей тот же бинарный/исполняемый файл, как и на более высокой 64-разрядной машине. Он был скомпилирован на более высокой аппаратной машине, но для 32-битной архитектуры. Я не вижу, как неправильный тип приведет к тому, что один и тот же исполняемый файл сработает, но не с тем же текстовым файлом. Я что-то упускаю? – user3353819