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

问题描述 投票:0回答:1

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

例如,我正在使用

char name [10];

代替

std::string name;
char* name;

我的想法是,该类的对象在堆栈上创建为完全封闭的块。随着性能的提高,因为,如果我没有记错的话,对堆栈的访问比对堆栈的访问要快得多。

我在这些假设中正确吗?

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

c++ performance security stack encapsulation
1个回答
0
投票

对堆栈的访问比对堆栈的访问要快得多

这是错误的:对内存的访问就是对内存的访问。这里有两件事可能使您感到困惑。

首先,确实可以以不同的速度访问不同类型的内存。例如,磁盘通常是最慢的(不用谈论网络,这会使事情更加复杂),而寄存器通常是最快的。介于两者之间的是主内存或RAM,堆栈和堆都驻留在其中。然后,您可以拥有缓存,不同类型的磁盘等等。

第二,堆栈分配确实比堆分配快,只是因为分配方案更简单。顾名思义,使用堆栈时,只能在最后分配和取消分配,这意味着您需要遵循特定的顺序。使用堆,您几乎可以在任何地方分配,这意味着您可以在任何时候以任何顺序进行分配。这意味着对内存的某种管理会带来自身的问题,例如碎片。

这种绝对封装的想法在外部实践中有意义吗?

首先,仅由于堆栈大小有限,实际上在实践中不可能仅使用堆栈。尽管实际大小会有所不同,但目前不太可能超过8MB。一旦需要加载大于此大小的文件,就无法在堆栈上进行加载。

但是,即使堆栈大小实际上是无限的,您仍然需要以与分配它们相反的顺序取消分配,否则它不再是堆栈。这样很多事情是不可行的。例如,一旦需要交互性,就需要某种事件处理(以响应用户输入),并且通常使用队列来完成,这与堆栈的相反。当然,您可以分配一个非常大的队列,但这在实践中是不可行的。想到的另一个例子是网络。如果要一次处理多个连接(例如,像Web浏览器),则需要独立处理与每个连接相关的内存。同样,您可以为每个连接分配大量的内存,但这在实践中是不可行的。

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

© www.soinside.com 2019 - 2024. All rights reserved.