中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

字節對齊-------結構體、共用體

發布時間:2020-06-26 03:48:38 來源:網絡 閱讀:716 作者:_xd_ 欄目:編程語言

字節對齊
結構體字節對齊:(結構體成員的數據類型為基本數據類型(int,double,char,short,long等))
結構體的總大小是結構體成員中最寬基本數據類型大小的整數倍
#include<iostream>
using namespace std;
struct S0
{
int a;
char b;
short c;
};
struct S1
{
char b;
int a;
short c;
};
struct S2
{
short d;
char b;
short e;
int a;
short c;
};
void main()
{
S0 s0;
cout << sizeof(s0) << endl;
S1 s1;
cout << sizeof(s1) << endl;
S2 s2;
cout << sizeof(s2) << endl;
}
輸出結果:
8
12
16

總結:對于這種成員數據類型都為基本數據類型的結構體:
1.若最寬基本數據類型的成員位置在結構體成員的邊上(最上邊/最下邊),則其它小的數據類型字節數之和與最寬的類型大小對齊(整數倍),而結構體的大小就是最寬的數據類型大小與其它的對其后的大小(整數倍)之和;
如S0:
最寬(大)的類型為int(4字節) 其它:char(1個字節),short(2個字節) 總共3字節,與int對齊后為4字節,則結構體S0的字節大小為4+4=8 字節
2.若最寬基本數據類型的成員在結構體成員的中間位置,則是最寬的成員的上面和下面分別與最寬數據類型對齊(整數倍),則結構體的大小為3者之和(對齊后的)
如S1:
最寬(大)的類型為int(4字節) 上面:char(1字節) 對齊后占用4字節
下面:short(2字節) 對齊后占用4字節 則結構體的大小為4+4+4=12字節
如S2:
最寬(大)的類型為int(4字節) 上面:short(2字節) + char(1字節) +short(2字節)=5字節 對齊后占用8字節 (4的整數倍)
下面:short(2字節) 對齊后占用4字節 則結構體的大小為8+4+4=16字節

共用體大小:共用最寬的數據類型的空間大小
#include<iostream>
using namespace std;
union S1
{
int a;
long long b;
};

union S0
{
short b[3];
int a;
short c;
};
void main()
{
S0 s0;
cout << sizeof(s0) << endl;
S1 s1;
cout << sizeof(s1) << endl;
}
執行結果:
8
8
分析:
S1;最寬數據類型為long long(8)字節,所以共用這8個字節空間,共用體大小為8字節
S0:最寬數據類型為int(4字節),但是數組b short(2字節)*3=6字節,向上取4整數倍為8,所以共用8個字節空間

共用體里面包含結構體(或者共用體)
共用體的最大基本數據類型大于或等于其內部結構體(共用體)的在空間大小,則共用最大基本類型的字節空間
#include<iostream>
using namespace std;
struct S0
{
int a;
};
union S1
{
int a;
S0 b;
long long c;
};
void main()
{
S0 s0;
cout << sizeof(s0) << endl;
S1 s1;
cout << sizeof(s1) << endl;
}
輸出:
4
8

共用體的最大基本數據類型小于其內部結構體(或者共用體)的字節空間,則共用結構體(或者共用體)字節空間
#include<iostream>
using namespace std;
struct S0
{
int a;
long long b;
};

union S1
{
int a;
S0 b;
long c;
};
void main()
{
S0 s0;
cout << sizeof(s0) << endl;
S1 s1;
cout << sizeof(s1) << endl;
}
輸出:
16
16

結構體里面包含共用體(或者結構體)
結構體里面的基本數據類型沒有其內部共用體(或者結構體)中的最大基本數據類型大;則遵照結構體中只有基本數據類型的規則向其內部共用體(結構體)中的最大基本數據類型字節數對齊
#include<iostream>
using namespace std;
union S1
{
int a;
};
struct S0
{
short a;
S1 cl;
char b;
};
void main()
{
S1 s0;
cout << sizeof(s0) << endl;
S0 s1;
cout << sizeof(s1) << endl;
}
輸出:
4
12
#include<iostream>
using namespace std;
struct S0
{
int a;
long long b;
};
struct S1
{
int a;
S0 d;
long b;
};
void main()
{
S0 s0;
cout << sizeof(s0) << endl;
S1 s1;
cout << sizeof(s1) << endl;
}
輸出:
16
32

結構體里面的基本數據類型比其內部共用體(或者結構體)中的最大基本數據類型大或者相同,則向結構體里面的最大數據類型對齊(小的加起來對齊時還需加上共用體的大小)
#include<iostream>
using namespace std;
union S1
{
int a;
};
struct S0
{
int a;
S1 cl;
long long b;
};
void main()
{
S1 s0;
cout << sizeof(s0) << endl;
S0 s1;
cout << sizeof(s1) << endl;
}
輸出:
4
16
#include<iostream>
using namespace std;
struct S0
{
char a;
};
struct S1
{
S0 d;
long b;
};
void main()
{
S0 s0;
cout << sizeof(s0) << endl;
S1 s1;
cout << sizeof(s1) << endl;
}
輸出:
1
8

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁南县| 古浪县| 浦北县| 广西| 东台市| 永安市| 东宁县| 连云港市| 长泰县| 襄汾县| 清涧县| 当阳市| 江西省| 伽师县| 牡丹江市| 四平市| 东兰县| 高碑店市| 广汉市| 敖汉旗| 来安县| 鄄城县| 广元市| 荔波县| 山西省| 壶关县| 额济纳旗| 朝阳县| 武宁县| 武义县| 南部县| 双牌县| 玉林市| 辉县市| 来安县| 包头市| 中卫市| 易门县| 浙江省| 芷江| 南漳县|