目录
编译器和数组
补充:当要访问a[3]这个数组元素,编译器要将其编译成汇编代码,通过a的地址偏移(a的地址和a[0]地址一样),偏移3*int
注意看:上面的代码,sizeof(a)直接被编译器【编译】成14h,那么实际运行的时候并不存在,而且只要是cxx的编译器都可以在编译阶段完成这个任务。
那么,sizeof并不是一个函数,因为函数他是在运行的时候会动态的执行,
看这两段代码:
memcpy(Ptr, a, 5 * sizeof(int));
memcpy(Ptr, a, 5 * 4)
执行效率是一样的。
引用的本质:
①mov eax,dword ptr [esi]
dword表示的是双字,四字节。esi中保存的是为内存中的地址。将该地址处的4字节数据传送到eax中。
② lea eax,[ebp-0Ch]
把ebp-0Ch作为地址存入eax
堆和栈:
动态申请的都在堆,静态申请的都在栈。
栈在编译的时候就已经确定了一段大小的内存,是连续的。栈的内存容量有限,但是可以进行调整大小
为什么不能像数组那样地址连续放置数据呢?
通过查看变量的内存