C++中的sizeof怎么用?能計算什么?

sizeof 是 c++++ 中用于獲取數據類型或變量在內存中所占字節數的運算符,其結果在編譯時計算完成。1. 它有兩種基本用法:sizeof(type) 獲取數據類型大小,sizeof variable 或 sizeof(variable) 獲取變量大小。2. 可用于基本數據類型、數組、結構體、類及指針,其中數組可求總字節數,結構體和類包含對齊填充部分,指針則返回自身占用空間而非指向內容。3. 常見使用場景包括:通過 sizeof(arr)/sizeof(arr[0]) 計算靜態數組元素個數,注意該方法不適用于函數參數中的數組;理解結構體內存對齊機制,結構體大小通常大于成員變量之和。4. 注意事項包括:sizeof 不適用于運行時動態數組,傳遞數組給函數時會退化為指針導致無法正確獲取長度。掌握這些要點有助于更高效地進行底層編程與性能優化

C++中的sizeof怎么用?能計算什么?

sizeof 是 c++ 中一個非常常用的運算符,用來獲取數據類型或變量在內存中所占的字節數。它的使用方式簡單,但理解透徹后能幫助你更好地掌握內存管理和數據結構布局。

基本用法

sizeof 的基本語法有兩種:

  • sizeof(type):用于獲取某個數據類型的大小。
  • sizeof variable 或 sizeof(variable):用于獲取某個變量所占的空間大小。

例如:

立即學習C++免費學習筆記(深入)”;

int a; std::cout << sizeof(int) << std::endl;     // 輸出 int 類型的大小 std::cout << sizeof(a) << std::endl;       // 輸出變量 a 所占的大小

注意,sizeof 在編譯時就已經計算完成,并不是運行時操作。

能計算哪些內容?

sizeof 可以用于以下幾種常見情況:

  • 基本數據類型:如 int, char, Float, double 等。
  • 數組:可以獲取整個數組占用的總字節數。
  • 結構體(Struct)和類(class:返回整個結構體或類對象所占內存大小(包括填充對齊的部分)。
  • 指針:計算的是指針本身所占空間,而不是它指向的內容。

舉個例子:

char c; int arr[10]; struct MyStruct {     char a;     int b; };  std::cout << sizeof(c) << std::endl;        // 通常是 1 字節 std::cout << sizeof(arr) << std::endl;      // 通常是 40 字節(假設 int 是 4 字節) std::cout << sizeof(MyStruct) << std::endl; // 通常是 8 字節(考慮對齊)

使用場景與注意事項

計算數組元素個數

這是很實用的一個技巧:利用 sizeof(arr) / sizeof(arr[0]) 來計算數組元素個數。

int numbers[] = {1, 2, 3, 4, 5}; int count = sizeof(numbers) / sizeof(numbers[0]); // count 就是 5

不過要注意,這個方法只適用于靜態數組,不能用于指針傳參后的數組。

結構體內存對齊問題

結構體的大小不等于成員變量大小之和,因為存在內存對齊機制。不同編譯器可能有不同的對齊策略,比如通常會按照最大成員的大小進行對齊。

例如上面的 MyStruct:

struct MyStruct {     char a;   // 占 1 字節,但后面補 3 字節對齊到 4 字節邊界     int b;    // 占 4 字節 }; // 總共 8 字節

所以結構體的實際大小可能會比你預期的大一些。

指針 vs 數組

如果你傳遞一個數組給函數,它會退化為指針。此時再用 sizeof 就只能得到指針的大小了:

void func(int arr[]) {     std::cout << sizeof(arr) << std::endl; // 輸出的是指針大小(通常是 4 或 8 字節) }

所以在函數內部無法通過 sizeof 獲取數組實際長度。

總結一下

  • sizeof 是編譯期運算符,返回的是字節數。
  • 它能用于基本類型、數組、結構體等。
  • 對于數組求長度很有用,但要注意函數參數中的退化問題。
  • 結構體大小要考慮對齊,不能簡單相加。

基本上就這些。掌握了這些點,在寫底層代碼或者做性能優化時就能更得心應手了。

? 版權聲明
THE END
喜歡就支持一下吧
點贊8 分享