色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > C語言中的字節(jié)對齊

C語言中的字節(jié)對齊 時間:2018-09-28      來源:未知

1、什么是對齊?

現代計算機中內存空間都是按照字節(jié)(byte)劃分的,從理論上講似乎對任何類型的變量的訪問可以從任何地址開始,但實際情況是在訪問特定變量的時候經常在特定的內存地址訪問,這就需要各類型數據按照一定的規(guī)則在空間上排列,而不是順序地一個接一個地排放,這就是對齊。

2、為什么要對齊?

為了提高效率,計算機從內存中取數據是按照一個固定長度的。以32位機為例,它每次取32個位,也就是4個字節(jié)(每字節(jié)8個位)。字節(jié)對齊有什么好處?以int型數據為例,如果它在內存中存放的位置按4字節(jié)對齊,也就是說1個int的數據全部落在計算機一次取數的區(qū)間內,那么只需要取一次就可以了。如圖a-1。如果不對齊,很不巧,這個int數據剛好跨越了取數的邊界,這樣就需要取兩次才能把這個int的數據全部取到,這樣效率也就降低了。



內存對齊是會浪費一些空間的。但是這種空間上得浪費卻可以減少取數的時間。這是典型的一種以空間換時間的做法。空間與時間孰優(yōu)孰略這個每個人都有自己的看法,但是C語言既然采取了這種以空間換時間的策略,就必然有它的道理。況且,在存儲器越來越便宜的今天,這一點點的空間上的浪費就不算什么了。

需要說明的是,字節(jié)對齊不同的編譯器可能會采用不同的優(yōu)化策略。

3、如何實現對齊?

在缺省情況下,C編譯器為每一個變量或是數據單元按其自然對界條件分配空間。

在結構中,編譯器為結構的每個成員按其自然對界(alignment)條件分配空間。各個成員按照它們被聲明的順序在內存中順序存儲(成員之間可能有插入的空字節(jié)),第一個成員的地址和整個結構的地址相同。

C編譯器缺省的結構成員自然對界條件為“N字節(jié)對齊”,N即該成員數據類型的長度。如int型成員的自然對界條件為4字節(jié)對齊,而double類型的結構成員的自然對界條件為8字節(jié)對齊。若該成員的起始偏移不位于該成員的“默認自然對界條件”上,則在前一個節(jié)面后面添加適當個數的空字節(jié)。

C編譯器缺省的結構整體的自然對界條件為:該結構所有成員中要求的大自然對界條件。若結構體各成員長度之和不為“結構整體自然對界條件的整數倍,則在后一個成員后填充空字節(jié)。

例子1(分析結構各成員的默認字節(jié)對界條界條件和結構整體的默認字節(jié)對界條件):

struct Test

{

char x1; // 成員x1為char型(其起始地址必須1字節(jié)對界),其偏移地址為0

char x2; // 成員x2為char型(其起始地址必須1字節(jié)對界,其偏移地址為1

float x3; // 成員x3為float型(其起始地址必須4字節(jié)對界),編譯器在x2和x3之間填充了兩個空字節(jié),其偏移地址為4

char x4; // 成員x4為char型(其起始地址必須1字節(jié)對界),其偏移地址為8

};

因為Test結構體中,大的成員為flaot x3,因些此結構體的自然對界條件為4字節(jié)對齊。則結構體長度就為12字節(jié),內存布局為1100 1111 1000。

例子2:

#include

typedef struct

{

int aa1; //4個字節(jié)對齊 1111

char bb1;//1個字節(jié)對齊 1

short cc1;//2個字節(jié)對齊 011

char dd1; //1個字節(jié)對齊 1

} testlength1;

int length1 = sizeof(testlength1); //4個字節(jié)對齊,占用字節(jié)1111 1011 1000,length = 12

typedef struct

{

char bb2;//1個字節(jié)對齊 1

int aa2; //4個字節(jié)對齊 01111

short cc2;//2個字節(jié)對齊 11

char dd2; //1個字節(jié)對齊 1

} testlength2;

int length2 = sizeof(testlength2); //4個字節(jié)對齊,占用字節(jié)1011 1111 1000,length = 12

typedef struct

{

char bb3; //1個字節(jié)對齊 1

char dd3; //1個字節(jié)對齊 1

int aa3; //4個字節(jié)對齊 001111

short cc23;//2個字節(jié)對齊 11

} testlength3;

int length3 = sizeof(testlength3); //4個字節(jié)對齊,占用字節(jié)1100 1111 1100,length = 12

typedef struct

{

char bb4; //1個字節(jié)對齊 1

char dd4; //1個字節(jié)對齊 1

short cc4;//2個字節(jié)對齊 11

int aa4; //4個字節(jié)對齊 1111

} testlength4;

int length4 = sizeof(testlength4); //4個字節(jié)對齊,占用字節(jié)1111 1111,length = 8

int main(void)

{

printf("length1 = %d.\n",length1);

printf("length2 = %d.\n",length2);

printf("length3 = %d.\n",length3);

printf("length4 = %d.\n",length4);

return 0;

}

上一篇:Anddroid App和Java Web服務器間數據交互 之MySQL搭建

下一篇:SylixOS電源管理概述以及接口介紹

熱點文章推薦
華清學員就業(yè)榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業(yè)培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区
主站蜘蛛池模板: 日韩一级黄色av| 日本国产精品视频| 中文字幕亚洲图片| 神马久久久久久| 另类美女黄大片| 欧美大片免费观看在线观看网站推荐| 麻豆国产精品va在线观看不卡| 色噜噜亚洲精品中文字幕| www.久久色.com| 日韩欧美大尺度| 日本人成精品视频在线| 国产日韩亚洲欧美| 日韩精品久久久久久久玫瑰园| 亚洲欧美国产视频| 久久夜色精品国产亚洲aⅴ| 欧美激情精品久久久久久久变态 | 日本视频久久久| 国产有码一区二区| 亚洲精品天天看| 精品国产91久久久| 欧美在线免费看| 亚洲xxxx视频| 久久精品2019中文字幕| 久久久爽爽爽美女图片| 国产精品自产拍在线观| 亚洲午夜精品久久久久久性色| 欧美精品午夜视频| 欧美在线www| 国产丝袜一区视频在线观看| 麻豆成人在线看| 国产精品久久在线观看| 精品无人国产偷自产在线| 欧美日本亚洲视频| 国产精品久久9| 最近中文字幕日韩精品| 97avcom| 日韩精品极品视频免费观看| 欧美性xxxx在线播放| 亚洲综合av影视| 欧美日本高清视频| 国产日韩在线看片|