Ant*_*ony 6 c++ embedded multithreading memory-management vxworks
我遇到了一个奇怪的问题,我已经能够追踪到一些,但我仍然看不出原因.也许有人在这里可以解释一下?
我在VxWorks 5.5上运行PowerPC处理器,使用PPCgnu604工具链在C++中进行开发.
我有一个这样的课:
class MyClass
{
public:
void run( void );
private:
CommandMesssageClass command;
StatusMessageClass status;
};
Run Code Online (Sandbox Code Playgroud)
当我的应用程序启动时,它将动态分配一个MyClass实例并生成一个指向其"run"函数的线程.基本上它只是坐在那里轮询命令,并在收到后,将发回状态.
请注意,这是该类的简化版本.为简洁起见,还有许多其他方法和变量.
我看到的问题是当命令和状态消息都被定义为私有类成员时,我会在内存中获得可用字节的更改,尽管事实上应该没有动态内存分配.这很重要,因为这需要一个确定性和速率安全的程序.
如果我将一个或两个消息声明移动到run函数中,它可以正常工作而无需额外分配!
在理解C++声明和内存分配时,我必须遗漏一些基本内容.我的理解是,动态实例化的类实例将在创建时完全分配在堆上(包括所有成员变量).我在这里看到的区别在于将消息声明移动到run函数会将它们放在堆栈上.在这种情况下,堆的大小足以支持整个类的大小.为什么在使用特定部分之前似乎没有分配足够的内存?
消息类不会自己动态分配.(如果他们这样做了,我希望移动声明不会改变这种情况下的行为,我仍然会看到堆大小的变化.)
要监视内存分配,我正在使用以下VxWorks memLib(或memPartLib)调用:
memPartInfoGet( memSysPartId, &partitionStatus );
...
bytesFree = partitionStatus.numBytesFree;
Run Code Online (Sandbox Code Playgroud)
编辑:
为了澄清,MyClass对象在初始化例程中被实例化并初始化,然后代码进入速率安全处理.在此期间,在通过串行线路接收到命令消息(与命令或状态消息对象的第一次交互)时,分配额外的存储器(或者更确切地说,自由字节数减少).这很糟糕,因为动态内存分配不是确定性的.
我已经能够通过移动类变量来解决问题,正如我所描述的那样.
我对 C++ 声明和内存分配的理解一定缺少一些基本的东西。
我不这么认为。你上面所说的一切都是正确的——游戏程序员一直严重依赖这种行为。:-)
为什么在使用特定部分之前似乎没有分配足够的内存?
为了简洁起见,你忽略了课程的内容。我有一些调试类似问题的经验,我最好的猜测是,实际上,库函数中的某个地方正在进行您不知道的运行时分配。
换句话说,两种情况下都存在运行时分配,但是 MyClass 的两种不同大小意味着 malloc 池的填充方式不同。您可以通过将对象移动到 run() 内部的堆栈,但将 MyClass 填充到相同的大小来证明这一点。如果您仍然看到空闲内存下降,那么它与这些对象是在堆上还是在堆栈上无关……这是由于 MyClass 的大小而发生的次要影响。
请记住,malloc 是块状的——大多数实现不会为每次调用 malloc 进行一对一的分配。相反,它会过度分配内存并将其保留在池中,并在必要时增加这些池。
我不熟悉您的工具链,但嵌入式系统上意外小分配的典型嫌疑人包括 ctype 函数(区域设置)和日期/时间函数(时区)。
| 归档时间: |
|
| 查看次数: |
410 次 |
| 最近记录: |