我遇到了一个奇怪的问题,我已经能够追踪一些,但我仍然无法看到原因。也许这里有人可以说出一些光明?在嵌入式平台上线程级内存分配奇怪
我正在使用PPCgnu604工具链在C++开发的VxWorks 5.5之上运行PowerPC处理器。
我有一个类,像这样:
class MyClass
{
public:
void run(void);
private:
CommandMesssageClass command;
StatusMessageClass status;
};
当我的应用程序启动时,它会动态分配MyClass的实例和产卵指向它的“运行”功能的线程。本质上它只是在那里查询命令,一旦收到,就会返回状态。
请注意,这是一个类的削减版本。为简洁起见,还有许多其他方法和变量。
我看到的问题是,当命令和状态消息都被定义为私有类成员时,尽管事实上不应该有动态内存分配,我仍然会在内存中的可用字节中进行更改。这很重要,因为这是需要成为一个确定性和速率安全程序的情况。
如果我将一个或两个消息声明移动到运行函数中,它可以正常工作,不需要额外的分配!
我在理解C++声明和内存分配时必须缺少一些基本的东西。我的理解是,我动态实例化的类实例将在创建时在堆(包括所有成员变量)上完全分配。我在这里看到的区别是将消息声明移动到运行函数将它们放在堆栈上。在这种情况下堆是足够大,以达到整个班级的大小。为什么在使用特定部分之前似乎没有分配足够的内存?
消息类不会自己动态分配。 (如果他们这样做,我希望移动声明不会改变这种情况下的行为,我仍然会看到堆的大小发生变化。)
要监视内存分配,我使用以下VxWorks的memLib(或memPartLib)调用:
memPartInfoGet(memSysPartId, &partitionStatus);
...
bytesFree = partitionStatus.numBytesFree;
编辑:
为了澄清,所述MyClass的对象被instansiated和在初始化例程初始化,然后代码进入速率保护处理。在此期间,一旦通过串行线路接收到命令消息(与Command或Status消息对象的第一次交互),就会分配更多的内存(或者更确切地说,字节数量会自由减少)。这是不好的,因为动态内存分配不是确定性的。
我已经能够通过移动类变量来解决问题,正如我所描述的。
这不是entierly清楚你的问题是什么,是你使用更多的内存分配的东西,类成员VS在栈上,抑或是在使用的内存随时间的情况下,一个变化? – nos 2010-08-02 22:46:41
当您将成员提升到公共部分时,sizeof(MyClass)会发生变化吗?内存分配有多少变化? – 2010-08-02 23:08:31
* *分配改变了吗?较小的类对象更容易适应堆中的空闲块。 – 2010-08-03 07:19:12