国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看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
主站蜘蛛池模板: 综合视频一区 | 国产精品18久久久久久久久久久久 | 少妇精品久久久久久久久久 | 麻豆av电影在线观看 | 成人免毛片 | 久久综合久色欧美综合狠狠 | 精品国产乱码久久久久久久软件 | 九九热精品在线 | 国产一区二区三区欧美 | 久久精品亚洲精品国产欧美kt∨ | 真实的国产乱xxxx在线 | 国产免费av网站 | 欧美精品在欧美一区二区少妇 | 99久久精品免费看国产一区二区三区 | 国产欧美专区 | 国产在线精品一区 | 国产精品久久久久久久久 | 欧美黄色片 | 欧美日韩一二三区 | 欧美激情一区二区三级高清视频 | 日本免费精品视频 | 性做久久久久久久久 | 亚洲视频精品在线 | 国产欧美日韩一区二区三区 | 在线中文 | 午夜精品久久 | 九九re热| 亚洲精品久久久久久久久久久久久 | 午夜激情在线播放 | 国产精品福利午夜在线观看 | 久久婷婷丁香 | 国产美女久久久 | 成人高清av | 欧美日韩在线精品 | 国精产品一区二区三区有限公司 | 九九热这里 | 日本免费在线观看 | 精品久久久久久久久久久 | 欧美精品一区二区在线观看 | 久久久久一区二区三区 | 欧美二区三区视频 |