程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> struct結構體內的對齊問題

struct結構體內的對齊問題

編輯:關於C語言

struct結構體由於包含了不同的數據類型,而數據結構類型之間存在占用空間大小的問題,比如char型占用1字節,short int占用2字節,int、long int、指針、float占用4字節、double占用8字節(windows和linux中)。但計算機系統對基本數據類型可能允許地址做出了限制,要求某種類型的對象必須是2、4或8的倍數(為了簡化處理器和存儲系統之間的硬件設計——可以節省至少1根地址線)。

那麼對於給出的一個struct類型數據,我們如何判斷它占用多少空間呢?

很簡單!我們按照對齊原則即可做出正確判斷。但記住:即不是像某些教程說的用struct結構體中占用空間最大的那個變量的字節數乘以變量總數,也不是所有變量占用空間總和,然後補齊到占用最大空間變量所占用字節數的倍數。

那麼,到底如何計算呢?

舉個例子就明白了:

struct
{
  int i;
  char j;
  int k;
  char r;
  int s;
}s;
sizeof s = ?
答案是20。

struct
{
  int i;
  char j;
  char r;
  int k;
  int s;
}s;
sizeof s = ?
答案是16。

struct
{
  double i;
  char j;
  char r;
  int k;
  int s;
}s;
sizeof s = ?
答案是20。

struct
{
  double i;
  char j;
  int k;
  char r;
  int s;
}s;
sizeof s = ?
答案是24。

struct
{
  double i;
  char j;
  short k;
  char r;
  short s;
}s;
sizeof s = ?
答案是16。

看出問題了嗎?計算機系統按照struct中除了double外的變量類型中最大占用空間的字節數對齊。所以才有了上述結果。注意char在被int變量隔離開的時候,1個char也占用4字節,但兩個char甚至4個char緊挨著存放時則均只占用4個字節(訪問char變量按1的倍數訪問,這樣看來,CPU和存儲器之間的地址線也不能減少,因為有可能訪問到某地址,其最後一位也是1)。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved