【发布时间】: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 好主意。
-
最后,为什么你需要“节省内存”?您确定这不是过早优化的情况吗?通常所有类型的优化(针对性能或资源)都会导致代码更难阅读、理解和维护。当您需要扩展或维护代码时,过早地执行此操作会使将来变得更加困难。首先要专注于制作好的、可维护的代码。然后如果资源或性能有问题,那么您可以测量和基准以找到热点和瓶颈,并仅修复它们。