asm-pointers-and-memory
Contents
Basic Pointer
为啥需要 Pointer?
更容易
在不同代码段之间共享
信息,在不同代码段之间来回复制也是可以的。但用指针的形式更好。链式
数据结构, 如链表和二叉树。
pointer dereference
指针必须要有指向的值,才可以 dereference。 没有指向的指针,dereference 时会 runtime error。
NULL pointer
C -> NULL -> 0 -> false java -> null
pointer assignment
指针赋值
copy
shallow copy
copy reference
deep copy
copy real value
two levels
C 语言下指针探析
long pointer(void * ptr){
long *p = (long*)ptr;
return *p;
}
pointer:
pushq %rbp
movq %rsp, %rbp
movq %rdi, -24(%rbp)
movq -24(%rbp), %rax
movq %rax, -8(%rbp)
movq -8(%rbp), %rax
movq (%rax), %rax
popq %rbp
ret
由上可知:long *p = (long*)ptr
被编译成
- movq -8(%rbp), %rax %rax 这个寄存器里放的是传来的指针
- movq (%rax), %rax (%rax) 寄存器
间接寻址
,也就是取寄存器 %rax 指向的内存里的值。这就是指针在汇编层面的意义。
memory
variable -> variable name -> memory 编译后,变量名就没有了。
local memory
local memory is allocated automatically on function call and it is deallocated automatically when a function exits.
编译器管理 local memory,size 编译时决定。 Local memory 最根本的性质:相互独立,这是本地内存优点和缺点的根本原因。
stack frame
local memory 通过调用函数时创建的栈帧
来体现。
allocation
栈帧创建时, local variable 一并创建。
deallocation
栈帧销毁时,local variable 一并销毁。
lifetime
随着函数栈帧同生共死。
local/stack/automatic variable
栈帧中的变量。 local/automatic 底层经常使用 stack 结构来实现。
advantage of locals
- convenient. 函数需要临时的内存空间做计算,计算完毕后,释放。
- efficient. 分配和释放都很快。
- local copies.
pass by value local parameters are basically local copies of the information from the caller. caller 原值 callee 副本,如何修改不影响 caller 中的值 软件设计原则:seperate components
disadvantage of locals
- short lifetime. 和栈帧同生共死。(heap memory 解决)
- restricted communication。caller’s parameter -> callee 单向通信。(reference parameter 解决)
heap/dynamic memory
malloc() free()
lifetime
程序员自主决定何时申请内存, 申请多少内存,何时释放内存。 runtime 决定。
parameter
pass by value
local copy caller parameter(原值) callee parameter(副本) separate components
pass by reference
其实就是指针。这个二级结构。
pointer(上级),把上级传出去,就可以指挥下级了。
pointee(下级)
一级指针也可以理解为 hop
,非常像 router 中的下一跳。
ownership
each blok of memory has
exactly one
“owner” who takes responsibility fordeallocating
it.