引用是否占用記憶體空間?

2021-10-23 17:01:11 字數 1371 閱讀 8510

反彙編看一下:

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...