C++ 11 通过在类声明中使用指针来节省内存
Posted
技术标签:
【中文标题】C++ 11 通过在类声明中使用指针来节省内存【英文标题】:C++ 11 save memory by using pointer in class declaration 【发布时间】: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 好主意。 最后,为什么你需要“节省内存”?您确定这不是过早优化的情况吗?通常所有类型的优化(针对性能或资源)都会导致代码更难阅读、理解和维护。当您需要扩展或维护代码时,过早地执行此操作会使将来变得更加困难。首先要专注于制作好的、可维护的代码。然后如果资源或性能有问题,那么您可以测量和基准以找到热点和瓶颈,并仅修复它们。 【参考方案1】:这听起来像是polymorphism 的工作。
从A
可能包含B
或C
的事实来看,两者都不会改变A
的接口,看来B
和C
应该从一个共同的基础@继承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 写这篇文章让我意识到你可能需要更多关于你的用例的细节。我完全不知道这是否符合您的需求以上是关于C++ 11 通过在类声明中使用指针来节省内存的主要内容,如果未能解决你的问题,请参考以下文章
C++:如何使用thread_local来声明一个指针变量?