亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++面試題之結構體內存對齊計算問題總結大全

2020-01-26 13:58:54
字體:
來源:轉載
供稿:網友

前言

本文給大家介紹的是關于C++結構體內存對齊計算的相關內容,內存對齊計算可謂是筆試題的必考題,但是如何按照計算原則算出正確答案一開始也不是很容易的事,所以專門通過例子來復習下關于結構體內存對齊的計算問題。話不多說,來一起看看詳細介紹吧。

編譯環境:vs2015

對齊原則:

      原則1:數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset為0的地方,以后每個數據成員的對齊按照#pragma pack指定的數值和這個數據成員自身長度中,比較小的那個進行。

      原則2:結構(或聯合)的整體對齊規則:在數據成員完成各自對齊之后,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大數據成員長度中,比較小的那個進行。

      原則3:結構體作為成員:如果一個結構里有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍地址開始存儲。

默認對齊值:

Linux 默認#pragma pack(4)

window 默認#pragma pack(8)

注:可以通過預編譯命令#pragma pack(n) ,n=1,2,4,8,16來改變這一系數,其中的n就是指定的“對齊系數”。

例一:一字節對齊

第一步: 成員數據對齊

#pragma pack(1)struct AA { int a; //長度4 < 1 按1對齊;偏移量為0;存放位置區間[0,3] char b; //長度1 = 1 按1對齊;偏移量為4;存放位置區間[4] short c; //長度2 > 1 按1對齊;偏移量為5;存放位置區間[5,6] char d; //長度1 = 1 按1對齊;偏移量為6;存放位置區間[7] //整體存放在[0~7]位置區間中,共八個字節。};#pragma pack()

第二步: 整體對齊

整體對齊系數 = min((max(int,short,char), 1) = 1,所以不需要再進行整體對齊。整體大小就為8。

圖示如下:

例二:二字節對齊

第一步: 成員數據對齊

#pragma pack(2)struct AA { int a; //長度4 > 2 按2對齊;偏移量為0;存放位置區間[0,3] char b; //長度1 < 2 按1對齊;偏移量為4;存放位置區間[4] short c; //長度2 = 2 按2對齊;偏移量要提升到2的倍數6;存放位置區間[6,7] char d; //長度1 < 2 按1對齊;偏移量為7;存放位置區間[8];共九個字節};#pragma pack()

第二步: 整體對齊

整體對齊系數 = min((max(int,short,char), 2) = 2,將9提升到2的倍數,則為10.所以最終結果為10個字節。

圖示如下:(X為補齊部分)

例三:四字節對齊

第一步: 成員數據對齊

#pragma pack(4)struct AA { int a; //長度4 = 4 按4對齊;偏移量為0;存放位置區間[0,3] char b; //長度1 < 4 按1對齊;偏移量為4;存放位置區間[4] short c; //長度2 < 4 按2對齊;偏移量要提升到2的倍數6;存放位置區間[6,7] char d; //長度1 < 4 按1對齊;偏移量為7;存放位置區間[8];總大小為9};#pragma pack()

第二步: 整體對齊

整體對齊系數 = min((max(int,short,char), 4) = 4,將9提升到4的倍數,則為12.所以最終結果為12個字節。

圖示如下:(X為補齊部分)

例三:八字節對齊

第一步: 成員數據對齊

#pragma pack(8)struct AA { int a; //長度4 < 8 按4對齊;偏移量為0;存放位置區間[0,3] char b; //長度1 < 8 按1對齊;偏移量為4;存放位置區間[4] short c; //長度2 < 8 按2對齊;偏移量要提升到2的倍數6;存放位置區間[6,7] char d; //長度1 < 8 按1對齊;偏移量為7;存放位置區間[8],總大小為9};#pragma pack()

第二步: 整體對齊

整體對齊系數 = min((max(int,short,char), 8) = 4,將9提升到4的倍數,則為12.所以最終結果為12個字節。圖示如上。

注:可以通過stddef.h庫中的offsetof宏來查看對應結構體元素的偏移量。

例四:結構體中包含結構體的運算

整體計算過程如下

struct EE{ int a; //長度4 < 8 按4對齊;偏移量為0;存放位置區間[0,3] char b; //長度1 < 8 按1對齊;偏移量為4;存放位置區間[4] short c; //長度2 < 8 按2對齊;偏移量由5提升到6;存放位置區間[6,7] //結構體內部最大元素為int,由于偏移量為8剛好是4的整數倍,所以從8開始存放接下來的struct FF struct FF { int a1; //長度4 < 8 按4對齊;偏移量為8;存放位置區間[8,11] char b1; //長度1 < 8 按1對齊;偏移量為12;存放位置區間[12] short c1; //長度2 < 8 按2對齊;偏移量為13,提升到2的倍數14;存放位置區間[14,15] char d1; //長度1 < 8 按1對齊;偏移量為16;存放位置區間[16] }; //整體對齊系數 = min((max(int,short,char), 8) = 4,將內存大小由17補齊到4的整數倍20 char d;  //長度1 < 8 按1對齊;偏移量為21;存放位置區間[21] //整體對齊系數 = min((max(int,short,char), 8) = 4,將內存大小由21補齊到4的整數倍24};

圖示如下:

例五:再來一個嵌套結構體的計算

整體計算過程如下

struct B { char e[2]; //長度1 < 8 按2對齊;偏移量為0;存放位置區間[0,1] short h; //長度2 < 8 按2對齊;偏移量為2;存放位置區間[2,3] //結構體內部最大元素為double,偏移量為4,提升到8,所以從8開始存放接下來的struct A struct A { int a; //長度4 < 8 按4對齊;偏移量為8;存放位置區間[8,11] double b; //長度8 = 8 按8對齊;偏移量為12,提升到16;存放位置區間16,23] float c; //長度4 < 8,按4對齊;偏移量為24,存放位置區間[24,27] }; //整體對齊系數 = min((max(int,double,float), 8) = 8,將內存大小由28補齊到8的整數倍32};

圖示如下:

小結:當#pragma pack的n值等于或超過所有數據成員長度的時候,這個n值的大小將不產生任何效果。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲小视频在线观看| 97香蕉超级碰碰久久免费软件| 中日韩美女免费视频网站在线观看| 久久精品视频一| 中文.日本.精品| 精品精品国产国产自在线| 成人激情视频免费在线| 久久久成人精品视频| 成人写真视频福利网| 88国产精品欧美一区二区三区| 欧美日韩国产在线播放| 欧美成人自拍视频| 国产女人精品视频| 69视频在线播放| 久久久久久久999精品视频| 国产精品99久久久久久人| 2023亚洲男人天堂| 久久国产精品久久国产精品| 欧美尺度大的性做爰视频| 97碰在线观看| 亚洲肉体裸体xxxx137| 日韩精品在线看| 91av在线免费观看视频| 中文字幕精品在线| 久久久久久香蕉网| 日韩不卡中文字幕| 久久久久北条麻妃免费看| 国产免费久久av| 国产午夜精品理论片a级探花| 久久久国产在线视频| 亚洲午夜久久久久久久| 久久免费精品日本久久中文字幕| 日韩在线视频播放| 久久亚洲综合国产精品99麻豆精品福利| 97国产suv精品一区二区62| 亚洲二区在线播放视频| 91大神福利视频在线| 欧美老少做受xxxx高潮| 色婷婷av一区二区三区在线观看| 国产精品自拍网| 午夜免费在线观看精品视频| 欧美精品在线播放| 日韩国产欧美区| 97国产精品人人爽人人做| 欧美壮男野外gaytube| 国产成人精品视| 欧美日韩一区二区在线播放| 国产日韩精品综合网站| 亚洲性av网站| 欧美床上激情在线观看| 亚洲新中文字幕| 欧美性极品少妇精品网站| 精品欧美激情精品一区| 久久久久久久一区二区| 国产精品中文字幕久久久| 国产精品三级久久久久久电影| 精品久久久久久久中文字幕| 日本精品va在线观看| 成人精品福利视频| 亚洲第一偷拍网| 久久久免费观看| 操人视频在线观看欧美| 欧美精品情趣视频| 久久香蕉精品香蕉| 日韩精品在线免费播放| 久久久免费高清电视剧观看| 午夜剧场成人观在线视频免费观看| 国产第一区电影| 亚洲国产精品悠悠久久琪琪| 精品亚洲一区二区三区在线播放| 欧美黑人国产人伦爽爽爽| 欧美电影在线观看高清| 亚洲网站在线看| www.欧美免费| 不卡av在线播放| 日韩专区在线播放| 欧美视频中文在线看| 国产精品美女免费视频| 日韩在线免费av| 日本午夜人人精品| 亚洲精品二三区| 性色av一区二区三区免费| 久久久精品2019中文字幕神马| 视频在线一区二区| 国产精品视频自拍| 91久久国产婷婷一区二区| 亚洲综合色激情五月| 国产亚洲欧美日韩一区二区| 国产精品流白浆视频| 国产精品黄色影片导航在线观看| 久久久精品在线观看| 日韩中文字幕欧美| 亚洲一区二区免费在线| 91麻豆桃色免费看| 91sao在线观看国产| 亚洲高清福利视频| 国内揄拍国内精品| 成人妇女淫片aaaa视频| 亚洲欧美日韩精品久久奇米色影视| 夜夜嗨av色一区二区不卡| 国内精品国产三级国产在线专| 欧美孕妇孕交黑巨大网站| 日本欧美中文字幕| 性欧美暴力猛交69hd| 欧美性资源免费| 日韩在线观看高清| 尤物yw午夜国产精品视频明星| 国产精品h片在线播放| 日韩精品视频免费| 国产91在线高潮白浆在线观看| 中文字幕亚洲专区| 91精品国产91久久久久久最新| 国产精品视频精品| 国产成人精品视频在线观看| 欧美激情视频一区二区三区不卡| 国产精品视频xxxx| 亚洲国产精品字幕| 久久久免费观看| 亚洲最大的av网站| 欧美精品一区三区| 中文字幕久热精品视频在线| 国产亚洲a∨片在线观看| 欧美性理论片在线观看片免费| 色综合色综合久久综合频道88| 久久久亚洲欧洲日产国码aⅴ| 国产日本欧美在线观看| 国产一区二区美女视频| www日韩欧美| 国产精品久久久久久av福利| 国产精品99一区| 一个人看的www久久| 欧美电影在线观看| 成人欧美在线视频| 亚洲精品中文字幕女同| 亚洲人成在线免费观看| 成人疯狂猛交xxx| 欧美日韩激情视频8区| 亚洲欧洲高清在线| 欧洲永久精品大片ww免费漫画| 欧美大尺度激情区在线播放| 青草成人免费视频| 亚洲欧洲在线免费| 久久精品久久精品亚洲人| 国产精品一香蕉国产线看观看| 少妇av一区二区三区| 亚洲视频专区在线| 色综合五月天导航| 亚洲欧美制服第一页| 欧美天天综合色影久久精品| 国产伦精品一区二区三区精品视频| 91久久久久久国产精品| 亚州成人av在线| 国产v综合ⅴ日韩v欧美大片| 欧美日韩亚洲一区二区| 超碰97人人做人人爱少妇| 久久天天躁日日躁| 亚洲天堂影视av| 亚洲国产精彩中文乱码av在线播放| 亚洲一区二区免费在线| 国产一区二区成人| 亚洲精品电影久久久| 国产偷亚洲偷欧美偷精品| 中文字幕亚洲欧美日韩在线不卡| 亚洲欧美一区二区三区在线|