03-Reference&匯編

《C++文章匯總》
上一篇文章介紹了Extern、內聯函數Inline、Const《02-Extern、內聯函數、Const》,本文介紹Reference&匯編。

1.Reference

? 在C語言中,使用指針(Pointer)可以間接獲取、修改某個變量的值
? 在C++中,使用引用(Reference)可以起到跟指針類似的功能

#include <iostream>
using namespace std;

int main(int argc, const char * argv[]) {
    int age = 10;
    //定義了一個age的引用,refAge相當于是age的別名
    int &refAge = age;
    refAge = 20;
    refAge += 30;
    cout << age << endl;
    return 0;
}
//輸出
50

? 注意點

  • 引用相當于是變量的別名(基本數據類型、枚舉、結構體、類、指針、數組等,都可以有引用)
  • 對引用做計算,就是對引用所指向的變量做計算
  • 在定義的時候就必須初始化,一旦指向了某個變量,就不可以再改變,“從一而終”
int main(int argc, const char * argv[]) {
    int age = 10;
    int height = 20;
    //定義了一個age的引用,ref相當于是age的別名
    int &ref = age;
    ref = 20;
    ref += 30;
    
    ref = height;
    ref = 11;
    
    cout << height << endl;
    return 0;
}
//輸出20
  • 可以利用引用初始化另一個引用,相當于某個變量的多個別名
int main(int argc, const char * argv[]) {
    int age = 10;
    //定義了一個age的引用,ref相當于是age的別名
    int &ref = age;
    int &ref1 = ref;
    int &ref2 = ref1;
    
    ref += 10;
    ref1 += 10;
    ref2 += 10;
    cout << age << endl;
    return 0;
}
//輸出
40
  • 不存在【引用的引用、指向引用的指針、引用數組】
    ? 引用存在的價值之一:比指針更安全、函數返回值可以被賦值
  • 交換兩個值,函數每次調用都會在棧中重新開辟存儲空間,不會出現int &v1,int &v2從一而終只能指向一次
void swag(int &v1,int &v2){
    int temp = v1;
    v1 = v2;
    v2 = temp;
}
int main(int argc, const char * argv[]) {
    int a = 10;
    int b = 20;
    swag(a,b);
    cout << "a = " << a << "b = " << b << endl;
    int c = 1;
    int d = 2;
    swag(c,d);
    cout << "c = " << c << "d = " << d << endl;
    return 0;
}
//輸出
a = 20b = 10
c = 2d = 1

2.引用的本質

? 引用的本質就是指針,只是編譯器削弱了它的功能,所以引用就是弱化了的指針
? 一個引用占用一個指針的大小:ref存儲的age的地址值

int main(int argc, const char * argv[]) {
    int age = 10;
    int *p = &age;
    *p = 20;
    cout << sizeof(p) << endl;
    int &ref = age;
    ref = 22;
    cout << sizeof(&age) << endl;
    cout << sizeof(&ref) << endl;
    return 0;
}

3.匯編

image

A.寄存器與內存

? 通常,CPU會先將內存中的數據存儲到寄存器中,然后再對寄存器中的數據進行運算
? 假設內存中有塊紅色內存空間的值是3,現在想把它的值加1,并將結果存儲到藍色內存空間
?CPU首先會將紅色內存空間的值放到EAX寄存器中:mov eax,紅色內存空間
?然后讓EAX寄存器與1相加:add eax,1
?最后將值賦值給內存空間:mov 藍色內存空間, eax


image

B.匯編語言的種類

? 匯編語言的種類
8086匯編(16bit)
x86匯編(32bit)
x64匯編(64bit)
ARM匯編(嵌入式、移動設備)
......
? x64匯編根據編譯器的不同,有2種書寫格式
Intel(Windows)
AT&T(Mac,gcc編譯器)
? 匯編語言不區分大小寫

C.AT&T匯編和Intel匯編

image

x64匯編-寄存器


image

image

D.x64匯編要點總結

?mov dest, src
將src的內容賦值給dest,類似于dest = src
?[ 地址值 ]
中括號[ ]里面放的都是內存地址
?word是2字節,dword是4字節(double word),qword是8字節(quad word)
從地址開始讀都是從低地址往高地址開始吞并4字節
mov dword ptr [1128h] 3,吞進去之后怎么排列4個字節順序與大小端模式有關了,小端模式從高地址往低地址開始讀,一個變量的地址值,是它所有字節地址中的最小值
?call 函數地址
調用函數
?lea dest, [ 地址值 ]
將地址值賦值給dest,類似于dest = 地址值
?ret
函數返回
?xor op1, op2
將op1和op2異或的結果賦值給op1,類似于op1 = op1 ^ op2
? 一個變量的地址值,是它所有字節地址中的最小值

E.CPU大小端模式,大部分都是小端模式(高高低低,高字節放高地址,低字節放低地址)

mov dword ptr [1128h] 3
內存地址 內容
1122h
1123h
1124h
1125h
1126h
1127h
1128h 00000011
1129h 00000000
112Ah 00000000
112Bh 00000000
112Ch

16進制
00 00 00 03H

2進制
00000000 00000000 00000000 00000011

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容