Причуда выделения памяти класса потока на встроенной платформе

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

Я работаю на процессоре PowerPC сверх разработки VxWorks 5.5 в C++ с набором инструментальных средств PPCgnu604.

У меня есть класс как так:

class MyClass
{
  public:
    void run( void );
  private:
    CommandMesssageClass command;
    StatusMessageClass status;
};

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

Обратите внимание, что это - срубленная версия класса. Существует много других методов и переменных, не учтенных для краткости.

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

Если я перемещаюсь один или оба из объявлений сообщения в функцию выполнения, она хорошо работает без дополнительных ассигнований!

Я должен пропускать что-то фундаментальное в своем понимании объявлений C++ и выделения памяти. Мое понимание - то, что экземпляр класса, что я динамично instansiate буду полностью выделен на "куче" (включая все членские переменные), когда это будет создано. Различие, которое я вижу здесь, было бы то, что перемещение объявлений сообщения к функции выполнения помещает их на стек вместо этого. "Куча" в этом случае является более, чем достаточно большой к accompadate весь размер класса. Почему это, кажется, не выделяет достаточно памяти, пока определенные части не используются?

Классы сообщений не делают никакого динамического собственного выделения. (И если бы они сделали, то я ожидал бы перемещаться, объявление не изменило бы поведение в этом случае, и я все еще видел бы изменение в размере "кучи".)

Для контроля выделения памяти, я использую следующий VxWorks memLib (или memPartLib) вызов:

memPartInfoGet( memSysPartId, &partitionStatus );
...
bytesFree = partitionStatus.numBytesFree;

Править:

Для разъяснения объект MyClass является instansiated и инициализированный в стандартной программе инициализации, и затем код вводит безопасную от уровня обработку. В это время на получение сообщения команды по последовательной линии (первое взаимодействие с объектами Команды или Сообщения о состоянии) дополнительная память выделяется (или скорее число байтов бесплатные уменьшения). Это плохо, потому что динамическое выделение памяти не детерминировано.

Я смог избавиться от проблемы путем перемещения переменных класса, как я описал.

6
задан Anthony 3 August 2010 в 12:36
поделиться