2010-08-02 54 views
6

我遇到了一个奇怪的问题,我已经能够追踪一些,但我仍然无法看到原因。也许这里有人可以说出一些光明?在嵌入式平台上线程级内存分配奇怪

我正在使用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消息对象的第一次交互),就会分配更多的内存(或者更确切地说,字节数量会自由减少)。这是不好的,因为动态内存分配不是确定性的。

我已经能够通过移动类变量来解决问题,正如我所描述的。

+0

这不是entierly清楚你的问题是什么,是你使用更多的内存分配的东西,类成员VS在栈上,抑或是在使用的内存随时间的情况下,一个变化? – nos 2010-08-02 22:46:41

+1

当您将成员提升到公共部分时,sizeof(MyClass)会发生变化吗?内存分配有多少变化? – 2010-08-02 23:08:31

+1

* *分配改变了吗?较小的类对象更容易适应堆中的空闲块。 – 2010-08-03 07:19:12

回答

2

我在理解C++ 声明和内存分配时必须缺少一些东西 。

我不这么认为。你所期望的所有内容都是正确的 - 游戏程序员一直非常依赖这种行为。:-)

为什么它似乎不被分配 足够的内存,直到被用于特定部分 ?

为了简洁起见,您已经省略了该类的内涵。我有一些经验调试类似的问题,而我最好的猜测是,在某处有一个库函数,其实,使得运行时间分配,你不知道。

换句话说,运行时间分配是有两种情况,但MyClass的两个不同尺寸意味着malloc的池不同填补。您可以通过将对象移动到run()内的堆栈来证明这一点,但可以将MyClass填充到相同的大小。如果你仍然看到空闲的mem drop,那么它与这些对象是堆栈还是堆栈无关......这是由于MyClass的大小而发生的第二个效果。

记住,malloc的是矮胖 - 大多数实现不为每次调用函数malloc做一比一分配。相反,它会过度分配内存并将其保留在池中,并在必要时增加这些池。

我不熟悉你的工具链,但在嵌入式系统意想不到的小分配典型的犯罪嫌疑人包括ctype函数(语言环境),以及日期/时间函数(时区)。