程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 簡單解釋 C / C++ 字節對齊

簡單解釋 C / C++ 字節對齊

編輯:C++入門知識

 

首先,引入兩個概念“數據類型大小”和“指定對齊值”:

數據類型大小:char 為1 個字節,short 為2 個字節,int 為4 個字節,double為8 個字節等等;

指定對齊值:#pragma pack (value) 所指定的對齊的值,例如g++ 4.5.2 x86 默認值為4;

引入一個重要的概念——有效對齊值N:

有效對齊值N =min( (1), (2)),即:“數據類型大小”與“指定對齊值”的最小值。

在C / C++ 語言中,需要同時滿足如下A、B兩個條件:

條件A:結構體(struct)的數據成員的 起始地址addr_start 需要是有效對齊值N的整數倍,即addr_start % N == 0;

條件B:結構體(struct)的大小必須是 所有成員變量的最大有效對齊值max_N 的整數倍,即sizeof(struct) % max_N == 0。

例如:

 

struct a { 

        char a1; 

        short a2; 

        short a3; 

        double a4; 

        int a5; 

        char a6; 

}; 

筆者機器的默認指定對齊值為4,分析:

a1 的有效對齊值為1,起始地址為0,占1 個字節;

a2 的有效對齊值為2,由於條件A,起始地址為2,a1與a2之間 空1 個字節,a2占2 個字節;

a3 的有效對齊值為2,由於條件A,起始地址為4,沒有間隔,a3 占2 個字節;

a4 的有效對齊值為4,由於條件A,起始地址為8,沒有間隔,a4 占8 個字節;

a5 的有效對齊值為4,由於條件A,起始地址為12,沒有間隔,a4 占4 個字節;

a6 的有效對齊值為1,由於條件A,起始地址為15,沒有間隔,a5 占1 個字節;

由於條件B,最大有效對齊值為4,總長度為4 的倍數, 結構體最後補3 個字節。

所以,上述結構體總共大小為24 個字節

摘自:楊卓荦的技術專欄

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