C ++堆栈和堆

时间:2016-09-09 15:11:27

标签: c++ stack heap

我经常看到这些声明:

class A
{
private:
    int a;
    int b;
public:
    // Ctor + Dtor + methods 
};

class B
{
private:
    int a;
    int b;
public:
    // Ctor + Dtor + methods
};

class C
{
private:
    A* aClass;
    B* bClass;
    // Other members.
public:
    // Ctor + Dtor + methods
};
使用new运算符动态分配

aClassbClass

假设

很多人在没有理由的情况下倾向于使用堆。动态分配AB类将减少堆栈上C对象的大小。然而,新的运营商是昂贵的" (执行时间),假设我们为AB中包含的所有变量设置了getter和setter,设置或获取A和/或B的成员将导致一些额外的计算,以便访问AB(取消引用AB,然后进行操作。)

以下是我的问题:

  • 写下面的内容会更好吗?

    class C
    {
    private:
        A aClass; 
        B bClass;
        // ....
    }
    
  • 可以用大对象进行这种方式导致堆栈溢出吗?

  • 如果编译器不知道"真实类型"是否能够进行某些优化? A*B*

修改

我忘了在两种情况下都提到C是一种成分(感谢C.LECLERC)。第一种情况用于实现构图。

1 个答案:

答案 0 :(得分:0)

好的,如果你做了一个甲板和卡片类。看下面

namespace game{

enum Rank{ACE=1,TWO,THREE,FOUR,FIVE,SIX,SEVEN,
               EIGHT,NINE,TEN,JACK,KING,QUEEN};

enum Suit{SPADE,DIAMOND,CLUB,HEART};

Class Card{
 public:
    Card(){
    suit = HEART;
    rank = ACE;
    }

    Card(int s, int r){
      suit = static_cast<Suit>(s);
      rank = static_cast<Rank>(r);
    }
 private:
    Rank rank;
    Suit suit;
};

Class Deck{
      public:
         Deck(int count){
              card = new Card[count];
        }
   // You would need a copy constructor of course but im lazy

       ~Deck() { delete [] card; } // Manually deallocate

         private:
          Card *card;
         };
     }

现在,如果我们转到主要并制作了一个新牌组,那么这个牌组将拥有用户在其中键入的牌数。这只是我要使用的一个例子,并说我们制作了52张空白卡片,让我们在卡片中创建一个卡片,使用另一种制作随机卡片的方法,或者可能是标准卡片。

你要问的事情有点奇怪,因为你定义了A和B类所以什么是“真正的类型”

当然有些东西比其他东西运行更快或更慢,比如在阵列上使用线性或二进制搜索,一个显然更快。

在分配这些对象时研究内存的关系。

还要密切关注构图,聚合和更多关系。

至于堆栈溢出,您是在使用嵌入式系统,还是制作一百万个对象,否则您应该没问题!