C的位元組對齊和位域操作

2021-10-06 17:24:29 字數 1524 閱讀 7366

首先分析位元組對齊之前,需要了解概念

自身對齊:資料結構自身的大小

指定對齊:編譯器或者使用者指定的值,例如__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 為什麼要位元組對齊 記憶體空間是按照位...