【问题标题】:C++ 11 save memory by using pointer in class declarationC++ 11 通过在类声明中使用指针来节省内存
【发布时间】:2017-07-09 17:20:50
【问题描述】:

大多数时候我可以找到堆栈溢出的答案。

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

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

A 类将始终只有一个“有效”类成员,这意味着只使用 B 或 C(或其他)。 但是,B 类通常有不止一个“有效”的类成员。

那么在 Class A 声明中使用“class B”或“class * 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),我可以在定义和程序运行期间节省大量内存。因为我知道只有一个或几个指针会被实际使用。

你怎么看?

【问题讨论】:

  • 完全取决于您的用例。我不建议使用原始指针。从标准 c++ Dynamic Memory Management 库中选择合适的东西。
  • 在您的第一个解决方案中,A 类将拥有 B 和 C 的副本,因此每当您创建 A 类的对象时,它都会调用 B 和 C 的构造函数。指针似乎是一个更好的主意,但又一次您一次只能使用一个指针。鉴于您始终只有“一个”处于活动状态,您可能希望查看有区别的联合(或自 c++11/14 以来的 std::variant)
  • @user0042, 是的,由于我的项目是基于 C++ 11,我将使用智能指针来避免内存问题。
  • @ChangLiao 好主意。
  • 最后,为什么你需要“节省内存”?您确定这不是过早优化的情况吗?通常所有类型的优化(针对性能或资源)都会导致代码更难阅读、理解和维护。当您需要扩展或维护代码时,过早地执行此操作会使将来变得更加困难。首先要专注于制作好的、可维护的代码。然后如果资源或性能有问题,那么您可以测量和基准以找到热点和瓶颈,并仅修复它们。

标签: c++ class pointers memory


【解决方案1】:

这听起来像是polymorphism 的工作。

A可能包含BC的事实来看,两者都不会改变A的接口,看来BC应该从一个共同的基础@继承987654329@ 和 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。考虑重组。

【讨论】:

  • 感谢您的意见。这让我想起了对我的项目的更好解释。以A为人,B C D为男、女等。 H I J K 等是体重、身高、年龄等。我正在努力提高以前项目的可读性和结构,到目前为止,这种面向对象/类型的方法对于未来的开发来说更加清晰。但我对其他方法持开放态度。
  • @ChangLiao 写这篇文章让我意识到你可能需要更多关于你的用例的细节。我完全不知道这是否符合您的需求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 2016-04-06
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
相关资源
最近更新 更多