为什么基本引用没有堆开销?

陳 力*_*陳 力 7 c++ memory heap operating-system reference

Stroustrup的C++的基础,他提供了一个纯面向对象语言(第4页).

class complex { double re, im; /* … */ };
complex a[ ] = { {1,2}, {3,4} };
Run Code Online (Sandbox Code Playgroud)

他认为a纯粹的面向对象语言是在堆上分配的,而a内存布局如下: 在此输入图像描述

可能的大小是3*sizeof(参考)+ 3*sizeof(heap_overhead)+ 4*sizeof(double).假设引用是一个单词而堆开销是两个单词,我们得到的可能大小为19个单词,与C++的8个单词进行比较.这种内存开销伴随着分配和间接访问元素的运行时开销.间接访问内存通常会导致缓存利用率问题并限制可ROM性.

我注意到最上面的引用没有堆开销(白色矩形).

我想这是一种普遍现象,而不是纯粹的OO示例语言.

但我找不到任何参考(我承认这不是一个搜索引擎友好的问题).

更新

谢谢你的回答.但是,我忘记发布我的原始猜测.(道歉,这是我的错.)

实际上,我也认为因为a它本身可能被分配在堆栈或其他地方,它本身不会有堆开销.但后来,我注意到BS也说:

将其与"纯面向对象语言"中更典型的布局进行比较,其中each user-defined object is allocated separately on the heap通过引用访问...

在第4页.

所以,我认为他已经将实现限制为仅限堆(或无堆栈).

(当然,也许我正在读这句话太多了.)

cma*_*ter 2

当您在堆上存储某些内容时,您会产生堆开销。这两个complex值存储在堆上,因此会产生开销。引用数组也存储在堆上,因此会产生开销。

但是,对数组的引用并不存储在堆上。通常,该引用将作为局部变量放置在堆栈上,或者可以通过使用 CPU 寄存器来优化堆栈存储。在任何一种情况下,引用本身只是一个本地指针变量,它本身没有堆分配开销。