1. 程式人生 > >c語言結構體巢狀的對齊方式

c語言結構體巢狀的對齊方式

1:在程式碼中有結構體巢狀的方式,又需要獲取每個變數的地址。那麼需要了解結構體巢狀和單一結構體的一些對齊方面的規則。

2:對於嵌入式的裝置來說,對齊很重要,有些cpu不支援不對齊的訪問方式,有的cpu支援,只是效率上會降低。

3:arm中預設編譯的時候會進行對齊。

規則一:結構體中的第一個成員位置在偏移量0,之後每個變數的偏移量必須是它本身位元組數的整數倍。

規則二:如果結構體中巢狀結構體,那麼巢狀的結構體的偏移量必須是它最大成員的位元組數的整數倍。

規則三:結構體的總偏移量必須是它最大成員位元組數的整數倍(包括巢狀的結構體中的最大成員)。

如果一個結構體B裡巢狀另一個結構體A,還是以最大成員型別的位元組對齊,

但是結構體A儲存起點為A內部最大成員整數倍的地方。(struct B裡存有struct A,A裡有char,int,double等成員,那A應該從8的整數倍開始儲存。),結構體A中的成員的對齊規則仍滿足自身的規則 
注意:
1)結構體A整體所佔的大小為該結構體成員內部最大元素的整數倍,不足補齊。 
2)不是直接將結構體A的成員直接移動到結構體B中。

一些特殊情況

其實對於4位元組對齊,如果含有巢狀結構體,那麼巢狀結構體本身也是4位元組對齊,那麼最後一個是32bit資料就沒有問題。因為之前的都會補上。

如果巢狀的結構體只有一個數據,那麼不管是16bit還是32bit,都不會有問題。因為類似於直接插入到結構體中,不存在本身的對齊問題

如果巢狀結構體最後是16bit,四位元組對齊,那麼如果沒有對齊,後面要補一個16bit,如果後面接著的變數是32bit的,那麼資料庫中的也是對的,因為本來16bit接一個32bit也需要補,正好巢狀結構體本身補了一個。

如果巢狀結構體都是16bit,結構體後面跟的也是16bit,那麼其實前面的結構體都是2 byte對齊,不需要補,所以連線下面的時候相當於直接連線,如果後面跟的是32bit的資料。那麼可能會因為地址不是4的倍數而補齊。

相關推薦

c語言結構方式

1:在程式碼中有結構體巢狀的方式,又需要獲取每個變數的地址。那麼需要了解結構體巢狀和單一結構體的一些對齊方面的規則。2:對於嵌入式的裝置來說,對齊很重要,有些cpu不支援不對齊的訪問方式,有的cpu支援,只是效率上會降低。3:arm中預設編譯的時候會進行對齊。規則一:結構體中

C語言結構字節簡單計算方法

最大的 一個數 數據類型 double short 位操作 結構體字節對齊 根據 struct 1.在C語言裏面每一種數據類型都有字節對齊比如在32位操作系統下:整型的自身對齊數就是 4 字節,字符型就是 1 字節,double就是 8 字節。 但是結構體的計算方式就和普通

C語言結構的位元組例項【C語言筆試題】

 一、筆試題目:在一個64位的作業系統中定義如下結構體: <span style="font-family:Microsoft YaHei;font-size:12px;">struct st_task { uint16_t id; uint32

C語言結構的位元組原則

為什麼要對齊?     現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何地址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體地址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的一個接一個的排放,

C#.NET結構字節[轉載]

第一個 屬性 設置 匯編 sum pos char bsp internal [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] internal struct DllInvoices

C語言結構中的邊界問題

沒錯,今天2月14,單身狗如我情人節也只能苦逼地擼程式碼了。不知道大家有沒有發現一個奇怪的現象,見圖~ 結構test裡面包含了1個int型變數和2個char型變數,照理說sizeof( struct test )應該等於它們三個相加的結果

C++中結構的位元組問題

  前不久,在C++程式中碰到一個有關結構體位元組對齊的問題。 一。問題描述 在程式中,定義了一個結構體,如下:typedef struct{   char name[33];   int ID;   int  age;} PERSON; 聲明瞭一個該結構體的陣列:PERSO

結構成員的方式

我們都知道每種資料型別佔有的記憶體空間大小都是明確,比如:char型別佔一個位元組,int型別佔4個位元組等等。我們可以通過使用sizeof關鍵字得到各種資料型別的長度: 例如:sizeof(char);//佔1個位元組  sizeof(int); //佔4個位元組 

C語言結構在內存中的存儲情況探究------內存

.com ret size \n str 技術 urn 存儲 typedef 條件(先看一下各個基本類型都占幾個字節): void size_(){ printf("char類型:%d\n", sizeof(char)); printf("in

C語言 結構位元組問題

摘選自這位大神的部落格 方法一: 結構體在記憶體中分配一塊連續的記憶體,但結構體內的變數並不一定是連續存放的,這涉及到記憶體對齊。原則1  資料成員對齊規則:結構(struct或聯合union)的資料成員,第一個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整

C語言結構(記憶體問題)

C語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出一個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?     開始學的時候,

【易錯】C語言結構記憶體問題

對於一個結構體的位元組數大家有沒有遇到什麼疑問呢? 先看一個結構體: typedef struct Test { char a1; int a2; char a3; short a4; }Test_T; 在32位編譯系統下這一個結構體的位元組數是多少呢?是1+4

結構(記憶體)和共用C語言

結構體 C語言學到現在,相信大家已經熟知了基本型別(整型、實型、字元型)的變數和一種構造型別資料(陣列),但是隻有這些資料型別是不夠的,因此我們接下來介紹C語言中可以將不同型別的定義自己的資料型別——結構體。 結構體與陣列的比較 由於結構體和陣列有很大的類似之處,所

第22節 C語言結構結構結構指標與結構陣列的程式碼實現

結構體 #include <stdio.h> //第一步 struct Student { //學號 int no; //姓名 char name[20]; //性別 char

C語言-----結構記憶體

結構體記憶體對齊規則: 第一個成員在結構體變數偏移量為0 的地址處。 其他成員變數要對齊到某個數字(對齊數)的整數倍的地址處。對齊數 = 編譯器預設的一個對齊數與該成員大小中的較小值。vs中預設值是8 Linux預設值為4. 結構體總大小為最大對齊數的整數

C語言結構的前向宣告,以及結構const結構成員的問題

如果你在宣告一個結構體A時,要使用一個未宣告的結構體B時,該怎麼辦?如下: #include <stdio.h> typedef struct demo{     struct stu test;     const int test2;     int te

什麼是C語言結構位元組,為什麼要?

一、概念     對齊跟資料在記憶體中的位置有關。如果一個變數的記憶體地址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設一個整型變數的地址為0x00000004,那它就是自然對齊的。       二、為什麼要位元組對齊        需要位元

C語言_結構和字串陣列的表示_plusC14.3

#include<stdio.h> #define LEN 20 const char *mgs[5]= {"qqqq","wwww","EEEEEEE","RRRR","TTTTT" }; struct apple {char smell[LEN];char

C語言結構與不對設定總結

相信不同的編譯平臺間的預設設定差異給大家帶來了很多困擾。在此,僅就結構體對齊解析下之間的差異設定方法。 1.gcc中結構體預設是4個位元組對齊,即為32的倍數。 1.1修改位元組對齊: struct data{ int a; char b; char c; }__

c語言結構指標 【結構各種噁心

#include<stdio.h> struct s1 {     float a;     struct     {         int ba;         int bb;