VC++中內存對齊

我們經常看到求 sizeof(A) 的值的問題,其中A是一個結構體,類,或者聯合體。

為了優化CPU訪問和優化內存,減少內存碎片,編譯器對內存對齊制定了一些規則。但是,不同的編譯器可能有不同的實現,本文只針對VC++編譯器,這里使用的IDE是VS2012。

#pragma pack()是一個預處理,表示內存對齊。布局控制#pragma,為編譯程序提供非常規的控制流信息。

?

/**********結構體的大小的規則*************/

結構體大小是處理器位數和結構體內最長數據元素所占字節數二者中較小的那一個的整數倍。

比如說,假設處理器位數為n,結構體內最大數據元素所占字節數為m。

處理器為32位,n = 4;結構體內最大數據類型為short,m = 2; n > m;結構體大小為m的整數倍,反之亦然。

注意:有些雖然是64位的操作系統,但是編譯器卻是32位的,此時位數為32.

1 class A{
2   int a;
3   char b;
4   short c;
5 };

sizeof(A)為8,為4的整數倍。

1 struct B{
2     short a;
3     short b;
4     short c;
5 };

sizeof(B)為6,為2(sizeof(short))的整數倍。

注意:C++中的結構體與類只有一個區別,就是結構體成員默認是public,而類默認是private。

?

class X{
public:double a;float b;int c;char d;
};

sizeof(X)為20,為4(處理器位數)的整數倍。

?

/********* #pragma pack(n) *************/

#pragma pack(n)中的n默認是4,即處理器位數32,但我們可以自己定義它的大小。

#pragma pack(1)
class A{
public:int a;char b;short c;
};

此時sizeof(A)為7,為1(#pragma pack(1))的整數倍。

#pragma pack(1)class X{public:double a;int b;short c;char d;};

sizeof(X)為15,為1(#pragma pack(1))的整數倍。

#pragma pack(4)class X{public:double a;int b;short c;char d;};

sizeof(X)為16,為4(#pragma pack(4))的整數倍。

#pragma pack(8)class X{public:double a;int b;short c;char d;};

sizeof(X)為16,為8(#pragma pack(8) 或者 sizeof(double))的整數倍。

?

/***************內存對齊**************/

結構體中數據元素所在內存地址由兩個因素決定。

一是#pragma pack(n) 中的n,二是元素類型所占字節數,sizeof(type),兩者中取較小的一個,元素內存地址到結構體或類的起始地址的偏移量為較小數的整數倍。

比如#pragma pack(n)默認為4,有以下結構體

struct A{int a;char b;short c;
};

a的起始地址距離結構體起始地址的偏移量為0,是sizeof(int)的整數倍。

b的起始地址距離結構體起始地址的偏移量為4,是sizeof(char)的整數倍。

c的起始地址距離結構體起始地址的偏移量為5,不是sizeof(short)的整數倍,所以它的起始地址偏移量將會是6,而不是5。

輸出a, b, c 的地址為

0043FD68

0043FD6C

0043FD6E

可以看到c的起始地址比b的起始地址大了2個字節,b占了2個字節的大小,這是因為c的類型是short型,大小為2,而n默認是4,sizeof(short) < n,所以偏移量應該是2的整數倍,這里是6.

?

轉載于:https://www.cnblogs.com/piginthetree/p/3894136.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258316.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258316.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258316.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS:轉載:IOS謂詞--NSPredicate

IOS謂詞--NSPredicate 分類&#xff1a; IOS應用2013-02-19 17:24 6792人閱讀 評論(1) 收藏 舉報Cocoa 提供了NSPredicate 用于指定過濾條件&#xff0c;謂詞是指在計算機中表示計算真假值的函數&#xff0c;它使用起來有點兒像SQL 的查詢條件&#xff0c;主要用于從集合中分揀…

cordova 更改app版本_Cordova打包Android應用流程(MAC)

擴展閱讀基于Cordova批量打場景包(MAC)APP包名稱命名規則1. 安裝cordova打包應用brew install cordova2. 創建cordova項目執行命令 create app com.githen.app 測試app * app 項目的目錄名稱 ( 下面所有目錄均以此目錄為根目錄說明 ) * com.githen.app 項目包名稱 * 測試app 項…

二級Python 第三方庫

?\color{salmon}\clubsuit? 本文總結了二級Python中經常考察的一些第三方庫的功能和分類&#xff0c;做到一半發現39&#xff0c;40知識點基本固定&#xff0c;突發奇想做個總結&#xff0c;有缺的話應該是前幾套 功能用途第三方庫數據可視化mayavi TVTK matplotlib vispy g…

深入理解Elasticsearch(原書第2版)》一1.2 何為Elasticsearch

本節書摘來華章計算機《深入理解Elasticsearch&#xff08;原書第2版&#xff09;》一書中的第1章 &#xff0c;第1.2節&#xff0c;[美]拉斐爾酷奇&#xff08;Rafal Ku&#xff09; 馬雷克羅戈任斯基&#xff08;Marek Rogoziski&#xff09;著 張世武 余洪淼 商旦 譯 更…

深搜——數字劃分問題

TYVJ 1271 零式求和 描述 請考慮一個由1到N&#xff08;N3, 4, 5 ... 9&#xff09;的數字組成的遞增數列&#xff1a;1 2 3 ... N。現在請在數列中插入“”表示加&#xff0c;或者“-”表示減&#xff0c;抑或是“ ”表示空白(例如1-2 3就等于1-23)&#xff0c;來將每一對數字…

正交解調原理

雷達系統發射和接收的脈沖是實信號。本文解釋了如何通過正交解調對接收信號進行頻帶搬移&#xff0c;從而獲得一個復的基帶信號。 ?一般具有較高載頻的低頻調制實信號表示如下&#xff1a; x(τ)cos[2πf0τ?(τ)](1)x(\tau)cos[2\pi f_0\tau\phi(\tau)]\tag{1} x(τ)cos[2π…

修改windows系統下xampp中apache端口被其他程式占用的問題

windows 7安裝後啟動xampp, 提示port 443 被其他程式占用。 網上查找解決方案: http://stackoverflow.com/questions/21182512/how-to-stop-vmware-port-error-of-443-on-xampp-control-panel-v3-2-1 * Open up httpd-ssl.conf in path2xampp\apache\conf\extra * Look for the…

channelinactive觸發后不關閉channel_go那些事兒|channel使用及其實現原理

目錄 channel背景channel基本用法channel應用場景channel實現原理channel數據結構channel實現方式channel注意事項閑聊歡迎加入我的公眾號【邁莫coding】 一起pk大廠1channel背景channel是Go的核心類型&#xff0c;是Go語言內置的類型&#xff0c;你無需引包&#xff0c;就能使…

遞推-練習2--noi3525:上臺階

遞推-練習2--noi3525:上臺階 一、心得 二、題目 3525:上臺階 總時間限制: 1000ms內存限制: 65536kB描述樓梯有n(100 > n > 0)階臺階,上樓時可以一步上1階,也可以一步上2階,也可以一步上3階&#xff0c;編程計算共有多少種不同的走法。 輸入輸入的每一行包括一組測試數據&…

matlab畫信號頻譜

為了讓大學生活充實一點&#xff0c;多學點東西&#xff0c;我選修了《數字信號處理》。現在充實得不要不要的。 clc close all clear%參數設置% Fs 1000; % Sampling frequency T 1/Fs; % Sampling period L 1500; …

關于字節序(大端法、小端法)的定義

關于字節序(大端法、小端法)的定義《UNXI網絡編程》定義&#xff1a;術語“小端”和“大端”表示多字節值的哪一端(小端或大端)存儲在該值的起始地址。小端存在起始地址&#xff0c;即是小端字節序&#xff1b;大端存在起始地址&#xff0c;即是大端字節序。 也可以說&#xff…

html div初始隱藏點擊可見_3種CSS3移動手機隱藏菜單UI界面代碼解析/附源碼下載...

這是一款效果非常酷的jQuery和CSS3移動手機隱藏菜單UI界面設計。這個UI設計共有三種不同的打開隱藏菜單的效果&#xff0c;分別為滑動顯示&#xff0c;Material Design風格效果和展開式效果。使用方法HTML結構這三種不同的隱藏菜單的HTML結構大致基本相同。第一種滑動效果菜單的…

《數據結構與抽象:Java語言描述(原書第4版)》一P.4.1 標識類

本節書摘來華章計算機《數據結構與抽象&#xff1a;Java語言描述&#xff08;原書第4版&#xff09;》一書中的第1章 &#xff0c;&#xff3b;美&#xff3d;弗蘭克M.卡拉諾&#xff08;Frank M. Carrano&#xff09; 蒂莫西M.亨利&#xff08;Timothy M. Henry&#xff09; …

【SVM】簡單介紹(一)

1、結構風險最小化 我們想要在未知的數據上得到低的錯誤率&#xff0c;這叫做structural risk minimization;相對的&#xff0c;訓練誤差叫做empirical risk minimization 要是我們能有這樣一個式子就好了&#xff1a; Test error rate <train error rate f(N,h,p)\text {…

L8_2

4.留下pid為12345的那個sh進程&#xff0c;殺死系統中所有其它sh進程 ps –ef|grep sh |awk ‘{if($2!”12345”) {print “kill “$2}}’ >killpid.sh cat killpid.sh ./killpid.sh 5. 根據以下日志文件&#xff0c;計算使用各種瀏覽器的人所占的百分比&#xff08;注意先排…

iOS 打包iPa

http://blog.fir.im/how-to-build-adhoc-ipa/ 之前都是打包好ipa然后發送給客戶&#xff0c;特麻煩&#xff0c;fir.im網站不錯 迅速獲取自己手機的udid: http://fir.im/udid 網頁安裝ipa&#xff1a; http://fir.im/cxsv 轉載于:https://www.cnblogs.com/shidaying/p/4829102…

# 遍歷刪除字典元素_第六章 字典

一、使用字典一個簡單的字典字典是一系列鍵——值對。每個鍵都與一個值相關聯&#xff0c;可以使用鍵來訪問與之相關聯的值。與鍵相關聯的值可以是數字、字符串、列表乃至字典。事實上&#xff0c;可將任何Python對象用作字典中的值。在Python中&#xff0c;字典用放在花括號{}…

user-select屬性用法

這是在css3 UI規范中新增的一個功能&#xff0c;用來控制內容的可選擇性。 auto——默認值&#xff0c;用戶可以選中元素中的內容none——用戶不能選擇元素中的任何內容text——用戶可以選擇元素中的文本element——文本可選&#xff0c;但僅限元素的邊界內(只有IE和FF支持)all…

弄清 CSS3 的 transition 和 animation

弄清 CSS3 的 transition 和 animation 原文:弄清 CSS3 的 transition 和 animation弄清 CSS3 的 transition 和 animation transition transition 屬性是transition-property,transition-duration,transition-timing-function,transition-delay的簡稱,用于設定一個元素的兩個狀…

【SVM】簡單介紹(二)

1、SVM另一種推法 我們不管分類平面&#xff0c;直接去假設Margin的兩個邊界&#xff1a; Plus-plane {x:w?xb1}Minus-plane {x:w?xb?1}\begin{aligned} & \text { Plus-plane }\{\boldsymbol{x}: \boldsymbol{w} \cdot \boldsymbol{x}b1\} \\ & \text { Minus-plan…