首先分析位元組對齊之前,需要了解概念
自身對齊:資料結構自身的大小
指定對齊:編譯器或者使用者指定的值,例如__attribute__ ((aligned (1))),設定為單位元組對齊
有效對齊:取自身對齊和指定對齊中較小的
分析結構體占用記憶體大小要看以下兩個條件
對於結構體或者類,要將其補齊為其有效對齊值的整數倍,結構體的有效對齊值是其最大資料成員的有效對齊值
存放成員的起始位址必須是該成員有效對齊值的整數倍
對於位域操作而言,我們需要關心如下:
a. 位域變數的長度不能大於其型別的長度sizeof(型別) ,例如bit_a中char a:10是不行的
b. 位域可以是無名位域,無名位域只能用作填充或調整位置,不能使用
c. 位域結構體的大小必須是其最長基本型別大小的整數倍sizeof(型別),參見foo4
d. 當乙個位元組不夠放時,可以另起乙個位元組,也可以有意重新起乙個位元組,例如如bs
f. 當結構體中有非位域操作時,整個結構體不進行壓縮,建test3
例子1:
struct bs
例子2:
struct foo4
;//大小為4
按照bit位,記憶體是連續的,配合__attribute__使用,gnu使用__attribute__選項來設定,例如下面例子中,test1使用一位對齊
attribute((aligned (n))),按照n位元組對齊
attribute((packed)),對於域是位對齊
#include
#include
typedef
struct test3
test3;
typedef
struct test2
test2;
struct bitbit1;
//預設位元組對齊
struct bit_a
__attribute__ (
(packed)
) bit_a1;
//位對齊
struct bit_aa
__attribute__ (
(packed)
) bit_aa;
//位對齊
typedef
struct test1
__attribute__ (
(aligned (1)
)) test1;
//單位元組對齊
intmain
(int argc,
char
* ar**)
~
/videos$ .
/io_1164
4452
位域位元組對齊
使用位域的主要目的是壓縮儲存,其大致規則為 1 如果相鄰位域字段的型別相同,且其位寬之和小於型別的sizeof大小,則後面的字段將緊鄰前乙個字段儲存,直到不能容納為止 2 如果相鄰位域字段的型別相同,但其位寬之和大於型別的sizeof大小,則後面的字段將從新的儲存單元開始,其偏移量為其型別大小的整數...
位元組對齊 位域 位元組序
測試環境 win 7 64bits,vmware workstation 12 pro,ubuntu 15.10 64bits,使用gcc version 5.2.1 20151010 include pragma pack 1 14,11,11 pragma pack 2 16,12,12 pra...
結構體位元組對齊和位域對齊 VC gcc
分類 c c 2012 10 13 15 34 474人閱讀收藏 舉報 1 什麼是位元組對齊 乙個變數占用 n 個位元組,則該變數的起始位址必須能夠被 n 整除,即 存放起始地 址 n 0,對於結構體而言,這個 n 取其成員中的資料型別佔空間的值最大的那個。2 為什麼要位元組對齊 記憶體空間是按照位...