微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从C ++中过度分配的内存部分中获取数组的大小

如何解决如何从C ++中过度分配的内存部分中获取数组的大小

我想研究一下delete []如何知道它必须从内存中删除多少个元素。我发现num-elems-in-new-array-overalloc很清楚。 我知道实现是特定于编译器的,但是我这里的问题是从内存中获取数组的正确大小。我没有直接需要此功能,只是想更清楚地了解。 如num-elems-in-new-array-overalloc所述,可以通过过度分配内存来存储数组的大小。

char* tmp = (char*) operator new[] (WORDSIZE + n * sizeof(int));

然后,导出指向第一个数组元素的指针,并将元素数量存储在tmp指针中。

int* p = (int*) (tmp + WORDSIZE);
*(size_t*)tmp = n;

我的假设是,在将p指针递减两次的情况下(我假设WORDSIZE == sizeof(size_t)sizeof(size_t)== 8 Byte),我应该得到数组大小n。 我做了一个小例子over-allocation在这里我尝试获取数组大小,但是在10个数组元素的情况下,我不知何故得到了49,而不是40。

int* tmp = arr - 2;
std::cout << "Array size: " << *tmp << std::endl;

Address 0: 0x9efe70
Address 1: 0x9efe74
Address 2: 0x9efe78
Address 3: 0x9efe7c
Address 4: 0x9efe80
Address 5: 0x9efe84
Address 6: 0x9efe88
Address 7: 0x9efe8c
Address 8: 0x9efe90
Address 9: 0x9efe94
Array size: 49 <- In question

我对WORDSIZE或编译器中的实现的假设可能是错误的。我想念什么?我知道How does delete[] “know” the size of the operand array?,但是答案并不能真正满足我的问题。

对于repl.it有问题的人,请参见完整示例:

#include <iostream>

void printMemoryLayout(int *arr,int n) {
    for(int i = 0; i < n; ++i) {
        std::cout << "Address " << i << ": " << &arr[i] << std::endl;
    }
}

int n = 10;

int main() {
    int* arr = new int[n];

    printMemoryLayout(arr,n);
    int* tmp = arr - 2;
    std::cout << "Array size: " << *tmp << std::endl;
}

更新: 使用的编译器是clang 7.0.0.3

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。