![](/img/trans.png)
[英]Allocating array in unmanaged C++ code after passing IntPtr pointer in C#, Marshaling Types
[英]allocating array pointer c++ equivalent code
我正在修改一些发现在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时得到的线性复杂度更好。
第二个版本声明一个unsigned char
并尝试为其分配一个unsigned char*
。 这将无法正常工作,即使如此,我也不知道为什么您要为256个intS
分配足够的空间,然后将它们分配给一个unsigned char*
除非您执行的级别很低。 无论如何, std::vector
可能是更好的选择。
小菜一碟: std :: vector比手动动态内存分配(普通指针)更可取。
#include <vector>
...
std::vector<char> fifoQueue(256);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.