Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 嵌入式平台上的线程类内存分配奇点_C++_Multithreading_Embedded_Memory Management_Vxworks - Fatal编程技术网

C++ 嵌入式平台上的线程类内存分配奇点

C++ 嵌入式平台上的线程类内存分配奇点,c++,multithreading,embedded,memory-management,vxworks,C++,Multithreading,Embedded,Memory Management,Vxworks,我遇到了一个奇怪的问题,我已经找到了一些,但我仍然看不到原因。也许这里有人能给你点启示 我在PXGNU604工具链上开发的C++上的VxWorks 5.5上运行PowerPC处理器。 我有一门课是这样的: class MyClass { public: void run( void ); private: CommandMesssageClass command; StatusMessageClass status; }; 当我的应用程序启动时,它将动态分配My

我遇到了一个奇怪的问题,我已经找到了一些,但我仍然看不到原因。也许这里有人能给你点启示

我在PXGNU604工具链上开发的C++上的VxWorks 5.5上运行PowerPC处理器。

我有一门课是这样的:

class MyClass
{
  public:
    void run( void );
  private:
    CommandMesssageClass command;
    StatusMessageClass status;
};
当我的应用程序启动时,它将动态分配MyClass的一个实例,并生成一个指向其“run”函数的线程。本质上,它只是坐在那里轮询命令,并在收到命令后返回状态

请注意,这是该类的精简版本。为了简洁起见,还有许多其他的方法和变量

我看到的问题是,当命令和状态消息都被定义为私有类成员时,我将得到内存中可用字节的更改,尽管事实上不应该有动态内存分配。这一点很重要,因为这是一个需要确定性和速率安全性的过程

如果我将一个或两个消息声明移动到run函数中,它就可以正常工作,无需额外分配

我必须忽略一些对C++声明和内存分配的理解。我的理解是,我动态实例化的类实例在创建时将完全分配到堆上(包括所有成员变量)。我在这里看到的区别是,将消息声明移动到run函数会将它们放在堆栈上。本例中的堆大到足以容纳类的整个大小。为什么在使用特定部分之前,它似乎没有分配足够的内存

消息类没有自己的动态分配。(如果他们这样做了,我希望移动声明不会改变这种情况下的行为,我仍然会看到堆大小的变化。)

为了监控内存分配,我使用以下VxWorks memLib(或memPartLib)调用:

编辑:

为了澄清,MyClass对象在初始化例程中实例化并初始化,然后代码进入速率安全处理。在此期间,在通过串行线(与命令或状态消息对象的第一次交互)接收到命令消息后,会分配额外的内存(或者说,空闲字节数会减少)。这是不好的,因为动态内存分配是不确定的

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

我一定错过了什么 我对C++的基本理解 声明和内存分配

我不这么认为。上面所说的一切都是正确的——游戏程序员一直非常依赖这种行为。:-)

为什么它似乎没有被分配 足够的内存,直到特定部分 你用什么

为了简洁起见,你漏掉了这门课的全部内容。我有过调试类似问题的经验,我最好的猜测是,在那里的某个地方,一个库函数实际上正在进行您不知道的运行时分配

换句话说,在这两种情况下都有运行时分配,但MyClass的两种不同大小意味着malloc池的填充方式不同。您可以通过将对象移动到run()内的堆栈来证明这一点,但将MyClass填充到相同的大小。如果您仍然看到空闲的mem drop,那么它与这些对象是在堆上还是堆栈上无关。。。这是由于MyClass的大小而产生的次要影响

请记住,malloc是块式的——大多数实现不会对每个malloc调用进行一对一的分配。相反,它在一个池中过度分配和保留内存,并在必要时增加这些池


我不熟悉您的工具链,但嵌入式系统上意外的小分配的典型嫌疑包括ctype函数(locale)和日期/时间函数(时区)。

不完全清楚您的问题是什么,是您使用了更多的内存来分配类成员还是堆栈上的内容,或者是其中一种情况下使用的内存随时间而变化?当您将成员提升到公共部分时,sizeof(MyClass)是否会变化?内存分配改变了多少?什么时候改变?较小的类对象更容易适应堆上的空闲块。nos:问题是动态内存分配发生在速率安全处理期间,并且内存分配不是确定性的。所有的东西都应该在初始化时分配,然后你只需要担心栈被破坏。卢瑟:内存分配每次改变80字节。我会看看今天的尺码。Hans:对象在开始时初始化,并在接收到串行命令时在处理循环中更改。然后将命令复制到CommandMessageClass对象中进行解码。Luther:MyClass对象的大小在移动到run函数时从608减小到256(下降的大小正好是我移动的两个对象的大小之和)。
memPartInfoGet( memSysPartId, &partitionStatus );
...
bytesFree = partitionStatus.numBytesFree;