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

标签 c++ c memory pointers overhead

我在 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/

相关文章:

c++ - Visual Studio项目中的 "Platform Toolset"设置是什么

c++ - 动态创建类

c++ - 从 C/C++ 调用 python 方法,并提取其返回值

Android AdMob 导致内存泄漏?

c - 算术和递归函数调用的堆栈内存使用

java - Minecraft Coder Pack终端内存错误伪造[Mac]

c++ - 当消息循环在另一个线程上时,等到窗口关闭

C - 从函数返回数组

c - 部分混淆C代码

c++ - 以 std::bitset 访问 std::uint8_t