記憶體對齊以及位域
首先我們大家先思考一個問題,為什麼編譯器會有記憶體對齊這種東西呢?
原因有二:
一.平臺原因:
某些硬體平臺只能在某些地址處取某些特定型別的資料,否則丟擲硬體異常。
二.效能原因:
如果訪問的是未對齊的記憶體,處理器需要做兩次記憶體訪問;如果記憶體對齊,則處理器只需要做一次記憶體訪問。
許多計算機系統對基本型別資料在記憶體中存放的位置有限制,它們會要求這些資料的首地址的值是某個數k(通常為4或8)的倍數,這就是所謂的記憶體對齊,而這個k則被稱為該資料型別的對齊模數。
記憶體對齊的規定:
1.資料成員對齊規則:結構的資料成員,第一個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員自身大小的整數倍開始。
2.結構體作為成員:如果是兩個結構體巢狀在一起,則在計算位元組大小的時候應該先找出第一個最大對齊模數和第二個函式體的最大對齊模數比較,找出最大的那個數,就是整個函式的最大對齊模數,然後用它的整數倍計算儲存。
3.結構體成員相對首地址偏移量必須是成員大小的整數倍,也就是記憶體對齊。
4.結構體總大小必須是對齊模數的整數倍。
記憶體對齊只能加不能減,在儲存型別不同的資料的時候,它們所佔的位元組大小也不同,在計算時是看前邊所有資料之和是否為k的倍數,而不是從上一節補。
位域
什麼是位域?
位域就是把一個位元組中的二進位制劃分為幾個不同的區域,並說明每個區域的位數。
一.位域的定義和位域的變數說明與結構體定義相仿,形式為:
struct 位域結構名
{位域列表};
其中位域列表的形式為: 型別說明符 位域名:位域長度
ex:
struct A
{
int a:8;
int b:2;
int c:6;
};
位域的儲存要求
1,一個位域必須存在同一個位元組中,不能跨越兩個位元組(1個位元組8個位)。
ex:
struct A
{
int a:5;
int b:4;//從下一個位元組開始存放
int c:6;
};
2.位域可以無位域名,這時它只能用做填充或調整位置,不能使用。
ex:
char :2 //該2 位不能使用
在計算位域的大小時,如果位域欄位穿插著非位域欄位,則不進行壓縮。
ex:struct B
{
char c:1;
double i;
int c2:4;
};
cout<<sizeof(B)<<endl;//13
struct B
{
char c:1;
int c2:4;
double i;
};cout<<sizeof(B)<<endl;//9
相關推薦
記憶體對齊以及位域
首先我們大家先思考一個問題,為什麼編譯器會有記憶體對齊這種東西呢? 原因有二: 一.平臺原因: 某些硬體平臺只能在某些地址處取某些特定型別的資料,否則丟擲硬體異常。 二.效能原因: 如果訪問的是未對齊的記憶體,處理器需要做兩次記憶體訪問;如果記憶體對齊,則處理器只需要做一次
sizeof(結構體)和記憶體對齊以及位域
Win32平臺下的微軟C編譯器的對齊策略:1) 結構體變數的首地址能夠被其最寬基本型別成員的大小所整除;備註:編譯器在給結構體開闢空間時,首先找到結構體中最寬的基本資料型別,然後尋找記憶體地址能被該基本資料型別所整除的位置,作為結構體的首地址。將這個最寬的基本資料型別的大小作
記憶體對齊與位域
記憶體對齊: 在討論之前我們先看一個栗子: #include<iostream> using namespae std; int main() { struct A { int a; char b;
初識-----記憶體對齊和位域
記憶體對齊: 首先,先看一段程式碼: 我們可以看出上面那個結構體的長度為24,按照正常的計算方法,它的長度應該為14,但是現在卻是24,這是什麼原因呢? 原來在程式執行的過程中為了便於cpu快速訪問,同時有效地節
結構體記憶體對齊,位段,列舉+聯合
1.結構體記憶體對齊 結構體記憶體對齊規則 1.第一個成員在與結構體變數偏移量為0的地址處 2.其他成員變數要對齊到對齊數的整數倍的地址處。對齊數=編譯器預設的一個對齊數與該成員大小的 較小值 vs中預設的值為8,linux中的預設值為4 3.結構體總大小為最
1.結構體型別建立 2.結構體初始化 3.結構體記憶體對齊 4.位段,位段計算機大小。 5.列舉 6.聯合
結構體型別的建立 1.結構體的宣告 結構是一些值的集合,這些值稱為成員變數。每個結構體的成員可以是不同型別的變數。 struct Student { char name[20];//名字 short age;//年齡 char sex[5
關於結構體記憶體對齊以及大小端
一直以來,結構體記憶體對齊都是大家討論的熱門話題,特別是對於初學者,總是會感覺理不清楚,本人最開始也是死記硬背,但是可想而知,過一段時間用的時候就會混淆。這幾天又看了幾篇關於記憶體對齊的文章,感覺略有
C++字節對齊與位域
oat sizeof int long 結構 code 操作符 targe 一個 一、字節對齊: 說明:為了提高 CPU 的存儲速度,編譯器會對 struct 和 union的存儲進行優化,即進行字節對齊。 1. 指定對齊參數值:通過#pragma pac
[轉]位域、大小端、記憶體對齊
宣告:由於本文的程式碼會受到計算機環境的影響,故在此說明本篇博文中的程式的執行環境。 1、Microsoft Windows 7 Ultimate Edition Service Pack 1 (64bit 6.1.7601) 2、M
sizeof:(含位域)結構體記憶體對齊,壓縮儲存
注:沒有額外宣告的結果均是在VC++環境中測試得到的結果。 1. sizeof 給出其運算元儲存位元組大小。 cout << " sizeof: " << endl; cout <&
C++虛擬函式表以及記憶體對齊文章
C++虛擬函式表以及記憶體對齊文章 C++ 物件的記憶體佈局(上) https://blog.csdn.net/haoel/article/details/3081328 C++ 物件的記憶體佈局(下) https://blog.csdn.net/haoel/article/deta
什麼是記憶體?以及記憶體的編址方法和記憶體對齊
什麼是記憶體? (硬體和邏輯兩個角度) 從硬體角度:記憶體實際上是電腦的一個配件(一般叫記憶體條)。根據不同的硬體實現原理還可以把記憶體分成SRAM和DRAM (DRAM又有好多代,譬如最早的SDRAM,後來的DDR1、DDR2 ... .. 
結構體、聯合體和位斷的記憶體對齊問題
記憶體對齊的原因: 1.平臺原因 不是所有硬體平臺都可以訪問任意地址上的任意資料; 某些硬體平臺只能在某些地址處取某些特定型別的資料,否則丟擲硬體異常。 2.效能原因 資料結構(尤其是
ARM記憶體邊界對齊以及sizeof問題
預設情況下,在32位cpu裡,gcc對於結構體的對齊方式是按照四個位元組來對齊的。看以下結構體 typedef struct pack{ char a; int b; short c; }pack; 對於Pack結構體,預設
記憶體對齊問題(結構體,聯合體,位段)
結構體 typedef struct A { char c1; char c2; int i; }A; typedef struct B { char c1; int i; char c2; }B; type
內存對齊以及如何關閉內存對齊
內存對齊 關閉 方式 clas 如何 char 以及 範圍 bsp 內存對齊以前有接觸過,最近又碰到好幾次,特整理記錄一下。 首先為什麽需要內存對齊? 內存對齊(memory alignment).為了提高程序的性能,數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在
struct自然邊界上的記憶體對齊
記憶體對齊大多數情況對程式設計師是透明的,是由編譯器自動處理。在C裡面允許我們干預記憶體對齊。而由於記憶體對齊的原因,巧妙的設計結構體也是非常必要的。 關於記憶體對齊問題,字、雙字和四字在自然邊界上不需要在記憶體中對齊,對字、雙字和四字來
結構體記憶體對齊模式
結構體的位元組大小,一個簡單的結構體定義如下,這個結構的大小應是8位元組(32位下) typedef struct MODEL4 { char c; int x; }MODEL4; char的大小是1,而int是4,但總的大小是8,這就是結構體記憶體對齊的原因。在32位的機器上,資料是以
C++11 記憶體對齊 alignof alignas
一 現象 先看一段程式碼: struct s1 { char s; int i; }; struct s2 { int i; double d; }; cout << "-------basic type" << endl; c
行內函數,巨集定義,記憶體對齊,型別轉換
巨集 與 inline的區別 存在的價值,兩者都是文字替換,降低程式跳轉次數,提高效率 1. define 是預處理命令,無法除錯 ,最簡單文字替換, inline 是編譯期替換,可以除錯, 存在引數型別檢查 2. 使用inline的時候,函式必須定義 直接定義的函式