成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++內存對齊詳細使用指南

開發 后端
C++內存對齊是因為什么而出現的呢?它的對齊規則又是怎樣的呢?在這里我們將會為大家詳細介紹一下這方面的基礎概念。

C++編程語言對內存的操作是一個非常復雜的應用步驟,我們在學習的過程中,需要不斷的從實踐編程中去總結這方面的應用經驗,以幫助我們理解。在這里我們就先來介紹一下C++內存對齊的相關方法。#t#

一、為什么會有C++內存對齊

以下內容節選自《Intel Architecture 32 Manual》。

為了提高程序的性能,數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在于,為了訪問未對齊的內存,處理器需要作兩次內存訪問;然而,對齊的內存訪問僅需要一次訪問。

一個字或雙字操作數跨越了4字節邊界,或者一個四字操作數跨越了8字節邊界,被認為是未對齊的,從而需要兩次總線周期來訪問內存。一個字起始地址是奇數但卻沒有跨越字邊界被認為是對齊的,能夠在一個總線周期中被訪問。

 

二、C++內存對齊規則

每個特定平臺上的編譯器都有自己的默認“對齊系數”(也叫對齊模數)。程序員可以通過預編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一系數,其中的n就是你要指定的“對齊系數”。

 

對齊規則:

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

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

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

4.各成員變量存放的起始地址相對于結構的起始地址的偏移量必須為該變量的類型所占用的字節數的倍數。

5.各成員變量在存放的時候根據在結構中出現的順序依次申請空間,同時按照上面的對齊方式調整位置,空缺的字節自動填充。

6.同時為了確保結構的大小為結構的字節邊界數(即該結構中占用***空間的類型所占用的字節數)的倍數,所以在為***一個成員變量申請空間后,還會根據需要自動填充空缺的字節。

 

三、pragma pack 宏

VC中提供了#pragma pack(n)來設定變量以n字節對齊方式。n字節對齊就是說變量存放的起始地址的偏移量有兩種情況:***、如果n大于等于該變量所占用的字節數,那么偏移量必須滿足默認的對齊方式,第二、如果n小于該變量的類型所占用的字節數,那么偏移量為n的倍數,不用滿足默認的對齊方式。結構的總大小也有個約束條件,分下面兩種情況:如果n大于所有成員變量類型所占用的字節數,那么結構的總大小必須為占用空間***的變量占用的空間數的倍數;否則必須為n的倍數。下面舉例說明其用法。

  1. #pragma pack(push) //保存對齊狀態  
  2. #pragma pack(4)//設定為4字節對齊  
  3. struct test  
  4. {  
  5. char m1;  
  6. double m4;  
  7. int m3;  
  8. };  
  9. #pragma pack(pop)//恢復對齊狀態 

 

 

以上結構的大小為16,下面分析其存儲情況,首先為m1分配空間,其偏移量為0,滿足我們自己設定的對齊方式(4字節對齊),m1占用1個字節。接著開始為m4分配空間,這時其偏移量為1,需要補足3個字節,這樣使偏移量滿足為n=4的倍數(因為sizeof(double)大于n),m4占用8個字節。接著為m3分配空間,這時其偏移量為12,滿足為4的倍數,m3占用4個字節。這時已經為所有成員變量分配了空間,共分配了16個字節,滿足為n的倍數。如果把上面的#pragma pack(4)改為#pragma pack(16),那么我們可以得到結構的大小為24。

以上就是對C++內存對齊的相關介紹。

責任編輯:曹凱 來源: 博客園
相關推薦

2010-02-02 15:01:59

C++成員函數指針

2019-11-13 12:39:26

Python 開發編程語言

2015-05-19 11:11:29

JavaScript事件使用指南

2010-01-19 12:53:59

VB.NET Text

2022-09-29 09:07:08

DataGrip數據倉庫數據庫

2015-10-27 09:25:11

Vi編輯器使用指南

2012-12-26 12:41:14

Android開發WebView

2010-02-02 14:27:54

C++ static關

2011-07-21 14:57:34

jQuery Mobi

2021-07-27 10:09:27

鴻蒙HarmonyOS應用

2009-12-28 17:40:10

WPF TextBox

2010-09-06 14:24:28

ppp authent

2025-06-23 08:40:00

MySQL數據庫運維

2011-08-04 13:32:21

Objective-C 方法 對象

2024-11-06 16:22:26

NetMQC#

2009-12-31 17:17:45

Silverlight

2021-01-12 15:19:23

Kubernetes

2017-01-04 15:22:57

TrimPath模板引擎

2010-06-03 17:27:36

Hadoop命令

2010-08-04 15:37:31

Flex圖表
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产欧美在线 | 男女啪啪高潮无遮挡免费动态 | 碰碰视频| 亚洲欧美日韩精品久久亚洲区 | 亚洲性爰 | 日日日操 | 亚洲女人天堂成人av在线 | 免费av电影网站 | 精精精精xxxx免费视频 | 激情av免费看| 国产午夜亚洲精品不卡 | 国产精品中文字幕一区二区三区 | 91精品久久久久久久久中文字幕 | 综合久久久 | 亚洲一级淫片 | 99在线免费视频 | 极情综合网 | 日本特黄a级高清免费大片 特黄色一级毛片 | 91婷婷韩国欧美一区二区 | 欧美性大战久久久久久久蜜臀 | 草草视频在线观看 | 阿v视频在线观看 | 香蕉一区| 欧美精产国品一二三区 | 亚洲精品中文字幕 | 精品一区二区三区入口 | www国产成人免费观看视频,深夜成人网 | 成人不卡| 一级黄色录像片子 | 日韩在线一区二区 | 欧美不卡 | 日韩在线观看网站 | 成人免费在线小视频 | 夜夜干夜夜操 | 中文字幕一区二区三区四区不卡 | 亚洲视频在线观看免费 | 日韩精品免费一区二区在线观看 | 精品欧美一区二区三区免费观看 | 97超碰人人草 | 9久9久| 91网站视频在线观看 |