繁体   English   中英

c / c ++中指针的内存开销

[英]memory overhead of pointers in c/c++

我在64位平台上,因此所有内存adrs都是8个字节。

因此,为了估计数组的内存使用情况,我应该为数组中的每个条目的sizeof(DATATYPE)添加8个字节。

例:

short unsigned int *ary = new short unsigned int[1000000]; //length 1mio
//sizeof(short unsinged int) = 2bytes 
//sizeof(short unsinged int*) = 8 bytes

那么每个条目占用10个字节吗? 因此,我的1mio长度数组是否会使用至少10兆字节?

谢谢

不,你没有得到每个数组索引的指针。 你得到一个指向数组的指针,这是一个连续的内存块,这就是为什么可以从索引本身加上数组地址计算任何索引的地址。

例如,如果内存位置0xffff0012已知的变量a设置为0x76543210 ,那么它们可以在内存中布局为:

            +-------------+ This is on the stack or global.
0xffff0012  |  0x76543210 |
            +-------------+

            +-------------+ This is on the heap (and may also
0x76543210  |  a[     0]  |   have some housekeeping information).
            +-------------+
0x76543212  |  a[     1]  |
            +-------------+
0x76543214  |  a[     2]  |
            +-------------+
0x76543216  |  a[     3]  |
            +-------------+
               :       :
            +-------------+
0x7672B68E  |  a[999999]  |
            +-------------+

你可以看到索引n的地址是0x76543210 + n * 2

所以你实际上有一个8字节指针和一百万个2字节短路,在你的情况下,总共2,000,008字节。

这是在任何malloc管理开销之上,与指针本身一样,与实际数组相比是微不足道的。

不,这里只有一个指针,而不是每个条目的指针。 您的尺寸估计为1000000 * 2 + 8。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM