如何解决如何从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 举报,一经查实,本站将立刻删除。