C ++ 11通过在类声明中使用指针来节省内存

时间:2017-07-09 17:20:50

标签: c++ class pointers memory

大部分时间我都可以在堆栈溢出时找到答案。

我正在开展一个项目,我需要一些建议。

A类将拥有数百万个对象/实例。 A类有几个成员,包括B类,C类和D类等。 B,C和D等等有许多成员H,I,J和K等。

A类总是只有一个“有效”类成员,这意味着只使用B或C(或其他)。 但是,B级通常有一个以上的“有效”级成员。

那么在A类声明中使用“B类”或“类* B”会有什么不同?同样,B类声明怎么样?

一些插图代码: 解决方案1 ​​

Class A
{
  B b;//i assume once A has an object, both b and c will take memory
  C c;
}

Class B
{
  H h;
  I i;
}

或解决方案2

Class A
{
  B * b;  //only one of B or C may be used buy we don't know so far
  C * c;
}
Class B
{
  H * h;//a combination of h, i, j, k, etc may be used, we still don't know so far.
  I * i;
}

我假设在类声明中使用空指针(解决方案2),我可以在定义和程序运行期间节省大量内存。因为我知道实际上只会使用一个或几个指针。

您怎么看?

1 个答案:

答案 0 :(得分:0)

这听起来像是polymorphism的工作。

根据A可能包含BC这一事实,并且要么不更改A的界面,似乎BC应该从公共基础BC继承而A应该有一个指向该

的指针
struct BC
{
    virtual int foo() = 0;
};
struct B : BC
{
    virtual int foo() override { return 42; }
};
struct C : BC
{
    virtual int foo() override { return 420; }
};
struct A
{
    BC* bc;  // which should likely be...
    std::unique_ptr<BC> ubc;

    int foo() { return ubc->foo(); }
};

同样适用于H以后,在B

中保留其常用基本指针的集合

如果您发现包含类的界面根据其内容发生了显着变化,那么您可能正在构建一个具有漏洞抽象的monolith。考虑重组。