陳 力*_*陳 力 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页.
所以,我认为他已经将实现限制为仅限堆(或无堆栈).
(当然,也许我正在读这句话太多了.)
当您在堆上存储某些内容时,您会产生堆开销。这两个complex
值存储在堆上,因此会产生开销。引用数组也存储在堆上,因此会产生开销。
但是,对数组的引用并不存储在堆上。通常,该引用将作为局部变量放置在堆栈上,或者可以通过使用 CPU 寄存器来优化堆栈存储。在任何一种情况下,引用本身只是一个本地指针变量,它本身没有堆分配开销。
归档时间: |
|
查看次数: |
262 次 |
最近记录: |