反彙編看一下:
int n =2;
intmain()
生成可執行檔案,反彙編得到:
a.out: file
format mach-o 64-bit x86-64
disassembly of section __text,__text:
__text:
100000f90: 55 pushq %rbp
100000f91: 48 89 e5 movq %rsp, %rbp
100000f94: 31 c0 xorl %eax, %eax
100000f96: 8b 0d 64 00 00 00 movl 100(%rip), %ecx
100000f9c: 89 4d fc movl %ecx, -4(%rbp)
100000f9f: 48 8d 55 fc leaq -4(%rbp), %rdx
100000fa3: 48 89 55 f0 movq %rdx, -16(%rbp)
100000fa7: 48 8b 55 f0 movq -16(%rbp), %rdx
100000fab: c7 02 03 00 00 00 movl $3, (%rdx)
100000fb1: 5d popq %rbp
100000fb2: c3 retq
_main:
100000f90: 55 pushq %rbp
100000f91: 48 89 e5 movq %rsp, %rbp
100000f94: 31 c0 xorl %eax, %eax
100000f96: 8b 0d 64 00 00 00 movl 100(%rip), %ecx
100000f9c: 89 4d fc movl %ecx, -4(%rbp) //變數a
100000f9f: 48 8d 55 fc leaq -4(%rbp), %rdx
100000fa3: 48 89 55 f0 movq %rdx, -16(%rbp)//引用b,儲存a的位址
100000fa7: 48 8b 55 f0 movq -16(%rbp), %rdx
100000fab: c7 02 03 00 00 00 movl $3, (%rdx)
100000fb1: 5d popq %rbp
100000fb2: c3 retq
結論:
從反彙編的結果看,編譯器也為引用在棧中分配了空間,儲存的是變數a的位址,且和指標變數一樣佔據8個位元組。
通過引用改變變數a的值,編譯器從引用獲取變數a的位址進行修改。
變數名是否占用記憶體空間?
變數 用來標識 identify 一塊記憶體區域,這塊區域的值一般是可以更改的,這就是它 變 的由來,但是我們可以通過使用如const等一些修飾符號來限定這一記憶體區域的操作特性 characteristic 即變數的操作特性。用const修飾的使變數不能更改的就和常量一樣的變數叫做常變數。變數名 ...
底層剖析引用實現原理(引用是占有記憶體空間的)
正如 c primer 中所述,引用即別名,它並非物件,相反地,它只是乙個已經存在的物件所起的另外乙個名字。剛學習c 的時候,覺得引用就是乙個別名,並不會占有記憶體。剖析了引用的底層實現原理之後,才發現這是錯誤的,引用也是會占有記憶體的,且底層是通過指標來實現的。以下是一段對引用和源變數取位址的 一...
分配記憶體空間
void calloc size t nobj,size t size 分配足夠的記憶體給nobj個大小為size的物件組成的陣列,並返回指向所分配區域的第乙個位元組的指標 若記憶體不夠,則返回null.該空間的初始化大小為0位元組.char p char calloc 100,sizeof cha...