我正在修改我发现在 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* Fifo::getMessageToWrite(){
Message* base = (Message*)fifoQueue;
return new(base + (fifoWritePtr & 255)) Message();
}
最佳答案
从表面上看,您想要传递 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 时。
关于c++ - 分配数组指针 C++ 等效代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9086518/