выделение указателя массива c ++ эквивалентного кода - PullRequest
0 голосов
/ 01 февраля 2012

Я изменяю некоторый код, обнаруженный внутри объекта C ++.Сообщение является классом C ++.

Исходная строка кода выглядит следующим образом:

unsigned char fifoQueue[256 * sizeof(Message)] = {0};

Поскольку я помещаю его в объект, я делаю это:

///in header
unsigned char fifoQueue;

///in object initializer
fifoQueue = new unsigned char[256 * sizeof(Message)];

Каким-то образомЯ не думаю, что это правильно.Какая правильная реализация, чтобы получить тот же результат?Я просто немного запутался в том, как это работает - в приведенном примере fifoQueue - это указатель на область памяти, правильно?Должен ли мой объект иметь переменную экземпляра fifoQueue в качестве указателя на массив «Message», вместо этого?

Спасибо!

/////// Хорошо, я добавляю некоторую информацию здесьэто имеет отношение к тому, как это используется.Извините, что не включили это раньше.

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

Message* Fifo::getMessageToWrite(){

    Message* base = (Message*)fifoQueue;
    return new(base + (fifoWritePtr & 255)) Message();

}

Ответы [ 3 ]

1 голос
/ 01 февраля 2012

Судя по всему, вы хотите передать объекты типа Message через очередь. Для этого правильный механизм C ++ должен использовать std::queue<Message>: он будет увеличиваться до соответствующего размера при отправке новых сообщений в очередь. В отличие от std::vector<T>, предложенного в других ответах, здесь фактически используется std::deque<Message> под капотом (вы можете использовать std::deque<Message> напрямую, но если вы хотите очередь, просто используйте очередь).

Преимущество использования std::queue<Message> состоит в том, что объект в этой очереди остается на месте, пока они перемешиваются в std::vector<Message>: в то время как std::vector<T> поддерживает только эффективное (т. Е. O (1)) добавление / удаление в спина как есть например используется для стека (LIFO), std::deque<T> поддерживает эффективное добавление / удаление на обоих концах, что необходимо для очереди (FIFO). Я думаю, что сложность добавления / удаления к std::deque<T> является только амортизированной константой, но это все же лучше, чем линейная сложность, которую вы получите с std::vector<T> при использовании его в качестве FIFO.

0 голосов
/ 01 февраля 2012

Кусок пирога: std :: vector является более предпочтительным способом, чем ручное динамическое выделение памяти (обычные старые указатели).

#include <vector>
...
std::vector<char> fifoQueue(256);
0 голосов
/ 01 февраля 2012

Вторая версия объявляет unsigned char и пытается присвоить ей unsigned char*. Это не сработает, и даже мне не понятно, почему вы бы выделили достаточно места для 256 intS и присвоили бы им unsigned char*, если вы не делаете что-то очень низкого уровня. В любом случае, std::vector, вероятно, лучший выбор.

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