激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++面試題之結構體內存對齊計算問題總結大全

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

2021-05-27 14:10Suhw C/C++

這篇文章主要給大家總結了關于C++面試題中結構體內存對齊計算問題的相關資料,文中通過示例代碼介紹的非常詳細,通過這些介紹的內容對大家在面試C++工作的時候,會有一定的參考幫助,需要的朋友們下面隨著小編來一起學習

前言

本文給大家介紹的是關于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就是指定的“對齊系數”。

例一:一字節對齊

第一步: 成員數據對齊

?
1
2
3
4
5
6
7
8
9
#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。

圖示如下:

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

例二:二字節對齊

第一步: 成員數據對齊

?
1
2
3
4
5
6
7
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為補齊部分)

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

例三:四字節對齊

第一步: 成員數據對齊

?
1
2
3
4
5
6
7
8
#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為補齊部分)

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

例三:八字節對齊

第一步: 成員數據對齊

?
1
2
3
4
5
6
7
8
#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宏來查看對應結構體元素的偏移量。

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

整體計算過程如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
};

圖示如下:

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

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

整體計算過程如下

?
1
2
3
4
5
6
7
8
9
10
11
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
};

圖示如下:

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

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

總結

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

原文鏈接:http://blog.csdn.net/sssssuuuuu666/article/details/75175108

延伸 · 閱讀

精彩推薦
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 蜜桃视频在线免费观看 | 黄色的视频在线观看 | 天天躁狠狠躁夜躁2020挡不住 | 久久久久久久久久久久久国产精品 | 羞羞色网站| 99久久免费看精品 | 国产精品久久久久久久av三级 | 一区二区三区国产在线 | 国产欧美一区二区三区免费看 | 国产成人在线网站 | 羞羞视频免费网站男男 | 狠狠干天天操 | 久久久久久久久成人 | 中文字幕亚洲情99在线 | 国产精品久久久免费观看 | 激情夜色| 毛片免费观看视频 | 一区二区网 | 97黄色网 | 狠狠干夜夜草 | 男女羞羞视频在线免费观看 | 中国fx性欧美xxxx | 国产成年人网站 | 成片免费观看视频大全 | 色999中文字幕 | 国产一区二区精彩视频 | 国产一级免费在线视频 | 污版视频在线观看 | 精品一区二区三区免费爱 | 久久久精品视频在线观看 | 国产在线精品一区二区三区 | 久久久精品视频在线观看 | 精品成人在线观看 | 欧美黄色片一级 | 国产成人综合在线观看 | 大奶一级片 | 精品亚洲夜色av98在线观看 | 国产一区二区三区视频免费 | 日本视频网 | 国产高潮失禁喷水爽到抽搐视频 | 91香焦视频|