Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;11通过在类声明中使用指针来节省内存_C++_Class_Pointers_Memory - Fatal编程技术网

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

C++ C++;11通过在类声明中使用指针来节省内存,c++,class,pointers,memory,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

大多数时候,我都能找到关于堆栈溢出的答案

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

类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),可以在定义和程序运行期间节省大量内存。因为我知道实际使用的指针只有一个或几个


你觉得怎么样?

这听起来像是一份适合你的工作

A
可能包含
B
C
这一事实判断,并且两者都不会改变
A
的接口,看来
B
C
应该继承自一个公共基
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(); }
};
struct-BC
{
虚拟int foo()=0;
};
结构B:BC
{
虚拟int foo()重写{return 42;}
};
结构C:BC
{
虚拟int foo()重写{return 420;}
};
结构A
{
BC*BC;//应该是。。。
std::唯一的ptr ubc;
int foo(){return ubc->foo();}
};
同样的情况也适用于
H
以后,在
B


如果您发现包含类的接口根据其内容发生了显著的更改,那么很可能您正在构建一个具有泄漏抽象的类。考虑重组。

完全取决于你的用例。不过,我不建议使用原始指针。在标准的C++解决方案中,在第一个解决方案中,类A将有B和C两个副本,所以每当创建类A的对象时,它将调用B和C的构造函数,这似乎是一个更好的想法,但是,再一次,您只会一次使用一个指针。假设你总是只拥有一个“活跃”,你可能想看看歧视性联盟(或者STD::C++ 11/14的变体)@ USE2442,是的,因为我的项目是基于C++ 11的,我将使用智能指针来避免内存问题。@ ChangLiao好主意。最后,为什么你需要“保存内存”?您确定这不是过早优化的情况吗?通常,所有类型的优化(针对性能或资源)都会导致代码更难阅读、理解和维护。在将来需要扩展或维护代码时,过早地执行此操作可能会使其变得更加困难。首先集中精力编写好的、可维护的代码。然后,如果在资源或性能方面存在问题,那么您可以进行测量和基准测试,以找到热点和瓶颈,并仅修复它们。感谢您的投入。这让我想起了对我的项目的更好的解释。以A为例,B、C、D分别是男性、女性和其他人。HI、J、K等是体重、身高、年龄等。我正在努力提高以前项目的可读性和结构,到目前为止,这种面向对象/类型的方法对于未来的开发更为清晰。但是我对其他方法持开放态度。@Changlao写这篇文章让我意识到您可能需要更多关于用例的细节。我完全不知道这是否适合你的需要