【问题标题】:memory overhead of pointers in c/c++c/c++中指针的内存开销
【发布时间】:2010-12-31 17:33:19
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 我建议您从头到尾阅读 Kerninghan 和 Ritchie 的《The C Programming Language》一书。将为您节省很多时间。

标签: c++ c memory pointers overhead


【解决方案1】:

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

例如,如果内存位置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 管理开销之上的,与指针本身一样,与您的实际数组相比是微不足道的。

【讨论】:

  • 可能值得注意的是,答案中提到的“单指针”是你自己的ary指针。 IE。正式地说,它与数组本身无关。数组本身正好占据 2,000,000 字节。
【解决方案2】:

不,这里只有一个指针,而不是每个条目的指针。你的大小估计是 1000000*2 + 8。

【讨论】:

    猜你喜欢
    • 2021-02-28
    • 2013-11-26
    • 1970-01-01
    • 2023-03-07
    • 2012-03-27
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多