嵌入式c ++:动态分配而不动态分配?

时间:2018-12-02 13:19:29

标签: c++ design-patterns embedded dynamic-typing static-allocation

这是我的问题,得到简化:

  • 我有一个C / C ++代码,一个C用于服务代码,一个C ++用于处理代码。
  • 我在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;
    };
  • 我有一个“建筑物”类,其中只有一种动物,但是在实例化建筑物时我不知道它的类型。
    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();
    }

我在这里苦苦挣扎:

  • 为建筑物中的动物分配内存,而在建筑物实例化过程中不知道动物的类型,
  • 动物的
  • 类型和属性可能会周期性变化 换句话说:可以使用静态分配进行动态类型化吗? 然后,如何调用这些实例,以便调用正确的方法?

这是我的限制条件

  • 嵌入式系统
  • 没有动态内存分配

我虽然是关于:

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

有没有可以满足我需求的设计/模型?

谢谢!

1 个答案:

答案 0 :(得分:2)

在C ++中,内存分配和对象存在是两个独立的概念,即使在大多数情况下,您也可以将两者一起处理。不过,就您而言,您可能希望将两者明确分开:

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

    char buf[N];    // N >= sizeof(T) for all T in your hierarchy
    
  2. 要创建动物:

    new (buf) GreyHound(args);
    
  3. 要消灭现有的动物(并为其他动物腾出空间):

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

也就是说,您将存储作为容器对象的一部分来获取,但是通过放置新的和明确的销毁来动态管理Animal对象的生存期。

还有更多的事情:您的内存还需要针对其中构造的所有类型正确对齐。您可以使用诸如std::aligned_storagestd::aligned_union之类的一些库辅助特性来简化计算,尽管您可能仍需要做一些工作来计算大小和对齐方式。


作为完全独立的替代方法,您可以放弃多态类的层次结构,而使用std::variant。这在概念上相似,但是在实现方式上有所不同。从概念上讲,这是相似的原因是因为您有一组有限的类型,所以您实际上并不需要多态来在运行时处理任意,未知派生类型。