[英]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.