C++ 减少内存使用

C++ 减少内存使用,c++,C++,我正在开发一个项目,在这个项目中我使用了很多课程。 为了创建类,我使用了新的操作符…例如,在香蕉类中,我有一个实例变量class apples 这是我想说的内容的缩小表示形式&不表示逐字逐句的代码…因此请不要指向语法错误…但请尝试理解方法学 在头文件(banana.h)中: 在banana.cpp中: class banana { banana::banana(void) { ap_obj = new apples; index = new int; *index

我正在开发一个项目,在这个项目中我使用了很多课程。 为了创建类,我使用了新的操作符…例如,在香蕉类中,我有一个实例变量class apples

这是我想说的内容的缩小表示形式&不表示逐字逐句的代码…因此请不要指向语法错误…但请尝试理解方法学

在头文件(banana.h)中:

在banana.cpp中:

class banana
{
  banana::banana(void)
  {
    ap_obj = new apples;
    index = new int;
    *index = ++counter;
  }
};
我的第一个问题是,我的方法在内存效率方面正确吗? (我知道我肯定没有任何运行时错误)

我的第二个问题是,我想通过使用index(请注意,每个香蕉对象都有一个唯一的index)变量访问任何类的方法中的一个香蕉对象。 为此,我考虑使用另一个类注册表(因为我想存储许多类对象的索引)。 我正在考虑在注册表类中存储任何类的第一个对象的指针。 &为了访问类的任何第n个对象的指针,我计划使用索引变量在第一个对象上使用指针算法…例如

class registry
{
  banana *base_obj;//this value will be initialised when i create the 1st object of banana class
  banana *registry::get_nth_object(int shift);
  {
    return *(base_obj + shift);//shift is the index variable of banana class
  }
};
在任何其他类中,我都可以调用get\n\u object&传递我想要其指针的对象的索引号&我将获得该点

我的代码有什么错误吗? 或者如果有什么可以改进的,请帮助我

供我参考。 我是一名机械工程专业的学生,如果我犯了任何愚蠢的错误,请原谅

我知道我肯定没有任何运行时错误

嗯,似乎您有一个运行时错误(或更多)。宣布

 int *index;
索引保留为未初始化的指针,并且

 *index = ++counter;
计数器
的内容放在
索引
指向的位置(该位置完全未定义)。这肯定会导致奇怪的错误

也许你想申报

  int index;

我想是吧

我知道我肯定没有任何运行时错误

嗯,似乎您有一个运行时错误(或更多)。宣布

 int *index;
索引保留为未初始化的指针,并且

 *index = ++counter;
计数器
的内容放在
索引
指向的位置(该位置完全未定义)。这肯定会导致奇怪的错误

也许你想申报

  int index;


我假设?

直接嵌入内存效率更高(它可以节省指针和堆分配的开销,并改进引用的局部性):


请注意,您忘记了在原始代码中添加
new
索引。我甚至不确定我是否理解它的必要性。仅用于查找特定的
香蕉
?如果是这样,它就根本不应该是
banana
的成员。为什么还要存储索引呢?引用特定实例的常用方法是使用香蕉*

直接嵌入内存效率更高(它既节省了指针的开销,也节省了堆分配的开销,并改进了引用的局部性):

请注意,您忘记了在原始代码中添加
new
索引。我甚至不确定我是否理解它的必要性。仅用于查找特定的
香蕉
?如果是这样,它就根本不应该是
banana
的成员。为什么还要存储索引呢?引用特定实例的常用方法是使用
香蕉*

  • 为了存储标量数据,不需要使用指针。这就是为什么
    int index
    。指定一些“不可能”的值以知道索引是非法的

  • 您的方法
    get\n\u object
    错误。您不能确定所有的
    banana的
    都分配在一致的内存块中。因此,您不能使用这种线性地址算法来获取对象。查找有关使用动态数组或列表的信息。对于数组,您可能需要检查有关重载订阅运算符的信息

  • 为了存储标量数据,不需要使用指针。这就是为什么
    int index
    。指定一些“不可能”的值以知道索引是非法的

  • 您的方法
    get\n\u object
    错误。您不能确定所有的
    banana的
    都分配在一致的内存块中。因此,您不能使用这种线性地址算法来获取对象。查找有关使用动态数组或列表的信息。对于数组,您可能需要检查有关重载订阅运算符的信息


  • 首先,香蕉构造函数本身的语法是不正确的。它不应该被文本类{}包围

    其次,使用new在堆上分配内存的速度足以满足您的需要。您不应该以任何其他方式执行此操作(即,不要使用malloc)。所以你在这一点上很好

    对于您的注册表示例,只有当您的所有香蕉实例都分配在连续的内存区域中时,get\n\u对象才会起作用。。。。当您使用new分配内存时,您无法控制的内容。如果您使用新的banana[size]为香蕉指针分配内存,那会更好,而且内存是连续的

    即使你在记忆中把它们按一定的间隔排列,如果你需要删除一根香蕉呢?还是两三个?还是半打?很快,你就要做一些真正紧张的记录来保持工作正常进行

    我自己更愿意在创建香蕉时为其构造函数中的每个香蕉分配一个唯一的ID,并在香蕉的构造函数中将其自身插入一个关联容器,如映射(即std::map)(使用#包含在代码中)。我将使用唯一ID作为键,然后您可以使用指向香蕉的指针作为值。在香蕉的析构函数中,我会让香蕉从注册表中删除它自己


    您的注册表将负责拥有关联容器(即映射)。

    首先,香蕉构造的语法
    class banana
    {
      apple apple_;  // a banana HAS A apple
    };
    
    class BananaRepository
    {
      typedef XYZType BananaID;
      Banana& GetByID(BananaID  id);
      BananaID Add(Banana& b);
    };
    
    class BananaRepository
    {
    public:
      typedef std::vector<Banana>::size_type BananaID;
    
      Banana& GetByID(BananaID  id)
      {
        return bananas_.at(id);
      }
    
      BananaID Add(Banana& b)
      {
         bananas_.push_back(b);
         return bananas_.size() - 1;
      }
    
    private:
      std::vector<Banana> bananas_;
    };