首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免使用指针时C++的性能和安全性

避免使用指针时C++的性能和安全性
EN

Stack Overflow用户
提问于 2020-05-24 10:39:33
回答 1查看 143关注 0票数 0

为了实践,我试图在C++中创建一个具有绝对封装和效率的类。在我的例子中,这意味着每个数据成员都应该在类中,没有指针指向外部(例如,动态分配的存储)。

例如,我正在使用

代码语言:javascript
复制
char name [10];

而不是

代码语言:javascript
复制
std::string name;
char* name;

我的想法是,类的对象是以完全封闭块的形式在堆栈上创建的。此外,性能也得到了提高,因为,如果我没记错的话,对堆栈的访问要比堆快得多。

我的假设正确吗?

这种绝对封装的想法在外部实践中是否明智?(例如,为了确保安全,似乎不存在内存管理不善或缓冲区溢出的风险)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-24 11:21:48

对堆栈的

访问要比堆快得多

这是错误的:对内存的访问就是对内存的访问。有两件事可能把你弄糊涂了。

首先,确实可以以不同的速度访问不同类型的内存。例如,磁盘通常是最慢的(没有提到联网,这使事情变得更加复杂),而寄存器通常是最快的。中间是主内存,即RAM,堆栈和堆都在其中。然后你可以有缓存,不同类型的磁盘,等等。

第二,堆栈分配确实比堆分配快,这仅仅是因为分配方案更简单。使用堆栈,顾名思义,只能在最后分配和释放,这意味着您需要遵循特定的顺序。有了堆,您几乎可以在任何地方分配,这意味着您可以在任何点和任何顺序进行释放。这意味着对内存进行某种形式的管理,这是由于内存本身的问题,例如碎片。

这种绝对封装的想法在外部实践中是明智的吗?

首先,仅仅使用堆栈在实践中是不可能的,因为它的大小是有限的。虽然这个大小在实践中可能有所不同,但目前不太可能超过8MB。一旦需要加载大于此大小的文件,就不能在堆栈上加载该文件。

但是,即使堆栈大小实际上是无限的,您仍然需要按照分配它们的相反顺序释放它们,否则它不再是堆栈。这样的话,很多事情都是行不通的。例如,只要您想要交互性,您就需要某种类型的事件处理(以响应用户输入),这通常是通过队列完成的,这与堆栈相反。当然,您可以分配一个异常大的队列,但这在实践中是不可行的。另一个出现在脑海中的例子是网络。如果您想同时处理多个连接(例如,web浏览器),则需要独立处理与每个连接相关联的内存。同样,您可以为每个连接分配大量的内存,但这在实践中是不可行的。

另外,请注意,封装并不意味着“没有指向动态分配内存的指针”。相反,“隐藏内存管理”将更接近这个概念的含义。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61984728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档