该问题值得探讨!
Lippman在对象模型里提到过一些(P257-P263),拍几张主要内容的图片
下面是自己的测试以及知乎的一些讨论和解答:
先贴自己的测试代码、反汇编以及内存转储图(测试环境:CodeBlocks、编译器GCC、系统64位)
【分别测试了数组大小为3和5的情况】
从内存转储可以看到,GCC其实并不是像网友说的那样,通过指针偏移、额外开辟8字节空间来存储长度。
具体是怎么做到的,目前我也不知道。有待探讨。
【下面贴出几个在知乎上看到的我觉得值得一看的回答】
“嗯,是这样的,内存管理库里总会有一个方法来记录你分配的内存是多大,你写的"在 p 地址之前有一个 n 记录这个数组的大小"是一种实现方法,管理库当然也可以自己维护一个列表,记录所有空间分配的位置和大小以及类型,delete的时候查一下这个列表就行了,也就是所谓"不是所有的编译器都是非这么实现不可",目前来说,常见的C++编译器也就是GCC/VCC/ICC/BCC等,具体实现可以查各编译器的文档说明,当然商业编译器不一定肯说.
作者:iux001
链接:https://www.zhihu.com/question/25556263/answer/31114361
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:夏华林
链接:https://www.zhihu.com/question/25556263/answer/32589012
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接:https://www.zhihu.com/question/25556263/answer/32589012
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
那就由我来给个详细的补充吧。
==========================
申请内存时,指针所指向区块的大小这一信息,其实就记录在该指针的周围
看下面这段代码:
==========================
申请内存时,指针所指向区块的大小这一信息,其实就记录在该指针的周围
看下面这段代码:
#include<cstdio>
#include<iostream>
#include<malloc.h>
#include<assert.h>
#include<ctime>
using namespace std;
#define size 16
int main(void)
{
void * p = NULL;
srand(time(0));
int a = 10;
while (a--)
{
int n = rand() % 10000;
p