我正在修改一些我发现在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();
}
答案 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);