我在 64 位平台上,所以所有内存地址都是 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
那么每个条目占用10bytes吗?因此,我的 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
管理开销之上的,与指针本身一样,与您的实际数组相比是微不足道的。
关于c++ - c/c++中指针的内存开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1990665/