分配数组指针c ++等效代码

时间:2012-01-31 20:32:19

标签: c++ arrays pointers

我正在修改一些我发现在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 个答案:

答案 0 :(得分:1)

从它的外观来看,您希望通过队列传递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时的线性复杂度要好。

答案 1 :(得分:0)

第二个版本声明unsigned char并尝试为其分配unsigned char*。这不会起作用,即使如此,我也不清楚为什么你会为256 intS分配足够的空间并将它们分配给unsigned char*,除非你做的事情非常低。无论如何,std::vector可能是更好的选择。

答案 2 :(得分:0)

小蛋糕:std::vector是更好的方式,而不是手动动态内存分配(普通指针)。

#include <vector>
...
std::vector<char> fifoQueue(256);