C++學習之路——第一天(結構體、C++程式從編寫到執行)

Sherioc發表於2024-07-21

引子:兜兜轉轉還是你~

C++資料型別

int 佔用 4 個位元組(32 位機)

char 佔用 1 個位元組(8 位機)

short 佔用 2 個位元組(16 位機)

long 佔用 4 個位元組(32 位機)

float 佔用 4 個位元組(32 位機)

double 佔用 8 個位元組(64 位機)

long double 佔用 16 個位元組(64 位機)

define 和 const 的區別

define 在編譯預處理過程中把所有的符號常量替換為所指定的字元序列,它沒有型別,在記憶體中並不存在以符號常量為名的儲存單元,它只是簡單的字串替換,因此它沒有資料型別,也就沒有儲存單元。

const 具有變數的特徵,它有資料型別,需要佔用儲存單元,儲存單元中存放的是不可變的常量值。

結構體記憶體對齊

struct S1
{
    char a;
    int b;
    char c;
} s1;
struct S2
{
    char a;
    char c;
    int b;
} s2;

sizeof(s1)=12, sizeof(s2)=8

結構體預設的位元組對齊一般滿足以下三點:

1、結構體變數的首地址能夠被其最寬基本型別的成員變數整除

2、結構體每個成員相對於結構體首地址的偏移量是該成員型別大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal alignment)。

3、結構體總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末一個成員之後加上填充位元組(trailing alignment)。

C++程式是如何執行的

C++程式從編寫完成到生成可執行檔案(exe)需要經過以下幾個階段:

預處理(Preprocessing):前處理器負責處理原始碼中的預處理指令,如#include、#define 和#if 等。前處理器將替換原始碼中的宏定義和條件編譯,生成一個預處理後的原始檔(通常為.i 檔案)。

編譯(Compilation):編譯器將預處理後的原始檔轉換為目的碼,通常是彙編程式碼(.s 檔案)或者機器程式碼。在這個過程中,編譯器會檢查語法錯誤並對程式碼進行最佳化。

彙編(Assembly):彙編器將編譯器生成的彙編程式碼轉換成目的碼檔案(通常是.obj 或.o 檔案)。目的碼檔案中包含了程式的機器指令、符號表(用於後續連結)以及重定位資訊(如全域性變數的地址)。

連結(Linking):連結器負責將一個或多個目的碼檔案連線成一個可執行檔案(如.exe 或.elf)。在這個過程中,連結器會解析符號表並處理外部引用,將不同的目的碼檔案中的同名符號合併,還會將執行環境(如 C 執行時庫)所需的程式碼和資料新增進可執行檔案。

載入(Loading):當您執行可執行檔案時,載入器會將可執行檔案從磁碟載入到記憶體中,併為其分配執行時資源,如記憶體和檔案描述符。接著,作業系統將控制權交給程式入口點(main 函式),程式開始執行。v

相關文章