当前位置: 首页 > 知识库问答 >
问题:

嵌入式c:没有动态分配的动态类型?

田向荣
2023-03-14

这是我的问题,简单来说:

    < li >我有一个C/C代码,C代表服务,C代表处理。 < li >我在C中有一个接口,它返回一个包含循环更新信息的结构RawData。
    enum AnimalType_t
    {
                DOG                         = 0,
                GREY_HOUND                  = 1,
                IMMORTAL_JELLYFISH          = 2,
    };
    struct RawData_t
    {
        int             age;
        AnimalType_t    typeOfAnimal;
    };

    RawData_t GetMyCurrentRawData();//returns the current raw data
    bool      IsDataReady(); //returns true if data is ready, false otherwise
  • 我有一个虚拟的母亲课程“动物”
    class Animal
    {
    public:
        virtual Animal();
        virtual ~Animal();
        int GetType() { return rawAttributes.typeOfAnimal; };   //the only implementation for all children
        virtual int GetAge() { return rawAttributes.age; };     //to be implemented in the child class
        virtual void UpdateAge() { rawAttributes.age++; };  //to be implemented in the child class
        virtual int GetNumberOfLegs() = 0;                      //to be implemented in the child class
    private:
        RawData_t rawAttributes;
    }
  • 我有一个已知的从母类继承的动物名单。
    class Dog : public Animal
    {
    public:
        Dog(RawData rawData):Animal(rawData){};
        int GetNumberOfLegs() {return 4;};                  
    };

    class GreyHound : public Dog
    {
    public:
        GreyHound(RawData rawData):Dog(rawData){};
    };

    class ImmortalJellyFish : public Animal
    {
    public:
        ImmortalJellyFish(RawData rawData):Animal(rawData){};
        int GetNumberOfLegs() {return 0;};      
        void UpdateAge() { return;} override;
    };
  • 我有一个类“Building”,其中只有一个动物,但当我实例化该建筑时,我不知道它的类型
    class Building
    {
    public:
        Building(){};
        //sorry for the long line, but you get the idea...
        int Display(void){if(IsDataReady()) DisplayOnScreen("This animal ( "+ animal_m.GetType()+") has " + animal_m.GetNumberOfLegs() + "legs and is " + animal_m.GetAge() + " years old\n";};
        int Live(void){currentDiagCode_m.UpdateAge();};

    private:
        auto                        animal_m; //?? not working
    };

    static Building paddock;
    static Building farm;

    void Buildings_Step(void)
    {
        paddock.Live();
        paddock.Display();
        farm.Live();
        farm.Display();
    }

这就是我挣扎的地方:

    < li >在建筑物实例化期间,在不知道动物类型的情况下,为建筑物中的动物分配内存, < li >动物的类型和属性可能会周期性地变化,换句话说:静态分配的动态分类是否可行?那么,我怎样才能调用这些实例,从而调用正确的方法呢?

以下是我的限制:

    < li >嵌入式系统 < li >无动态内存分配

我虽然关于:

  • 带有unique_ptr的工厂设计模式,效果很好!!!…但是,在堆上:(
  • 对象池?
  • 动态类型:但没有动态分配就不可能,是吗?

有什么设计/模型可以满足我的需求吗?

谢谢大家!

共有1个答案

饶承宣
2023-03-14

在C中,内存分配和对象存在是两个独立的概念,即使在大多数情况下您将同时处理这两个概念。但是,在您的情况下,您可能希望显式地将两者分开:

>

  • 为任何对象创建足够的内存:

    char buf[N];    // N >= sizeof(T) for all T in your hierarchy
    

    要创建动物:

    new (buf) GreyHound(args);
    

    要摧毁现有的动物(并为其他动物腾出空间):

    reinterpret_cast<Animal*>(buf)->~Animal();
    

    也就是说,您将存储作为容器对象的一部分获得,但您可以通过放置新的显式销毁来动态管理Animal对象的生命周期。

    还有一点:你的内存还需要为你在其中构建的所有类型正确对齐。您可以使用一些库助手特性,如std::aligned_storagestd::aligned_union来简化计算,尽管您可能仍需要做一些工作来计算大小和对齐。

    作为一个完全独立的替代方案,您可以放弃多态类层次结构,改用std::variant。这在概念上是相似的,但在实现方面有点不同。这在概念上是相似的,因为您有一组有界的类型,所以在运行时不需要多态性来处理任意的、未知的派生类型。

  •  类似资料:
    • 我在理解如何将另一个类中的动态值分配到其他变量时遇到了一些问题-我尝试使用正确的名称空间、正确的语法并阅读错误提供的文档-但是即使尝试实现所示的示例,也没有运气。我对C#知之甚少,因为我主要从事前端工作,但我必须在我工作的公司里逐步提高并开始学习一些面向后端的东西 我目前的代码如下: BrazeConnectionInputs.cs CreateCampaign.cs

    • 问题内容: 当您知道on上对象/项目的确切数量时,我非常想知道哪种内存分配方法对性能(例如,运行时间)有利,这对性能有好处。少量对象(少量内存)和大量对象(大量内存)的成本。 与 请告诉我。谢谢。 注意:我们可以对此进行基准测试,并且可能知道答案。但是我想知道解释这两种分配方法之间性能差异的概念。 问题答案: 静态分配将更快。静态分配可以在全局范围和堆栈上进行。 在全局范围内,静态分配的内存内置在

    • 当您知道中对象/项的确切数量时,我很想知道内存分配的首选方法是什么对性能(例如,运行时间)有好处Linux。少量对象(少量内存)和大量对象(大量内存)的成本。 例如,类型A【N】vs 请让我知道。非常感谢。 注意:我们可以对此进行基准测试,并可能知道答案。但我想知道解释这两种分配方法之间性能差异的概念。

    • 问题内容: 我正在尝试为如下对象创建动态映射: 我希望属性为嵌套类型,该类型是我在下面的映射中使用nested_feature模板定义的,并且按预期工作。但是,我也想让属性的嵌套对象中的每个属性都带有定义的其他属性。我尝试了第二个nested_template模板,但没有成功。 不幸的是,属性中的属性是从另一个进程创建的,几乎可以是任何名称/值对。关于如何使用动态模板将属性设置为嵌套的任何建议,以

    • 我试图为对象创建一个动态映射,如下所示:

    • 动态内存分配 我们之前在 C/C++ 语言等中使用过 malloc/free 等动态内存分配方法,与在编译期就已完成的静态内存分配相比,动态内存分配可以根据程序运行时状态修改内存申请的时机及大小,显得更为灵活,但是这是需要操作系统的支持的,同时也会带来一些开销。 我们的内核中也需要动态内存分配。典型的应用场景有: Box<T> ,你可以理解为它和 malloc 有着相同的功能; 引用计数 Rc<T