知識點
1:結構在記憶體中的儲存分配
--對齊原則
首先,我們應該知道:編譯器對變數進行儲存分配時,滿足以下優化原則:
n位元組元素首位址需要能夠被
n整除。該原則稱為對齊原則。
現闡述結構體成員的記憶體分配規律:
從結構體的首位址開始,向後依次為每個成員尋找乙個滿足條件的首位址
x,該條件為:
x%n=0(
n為各個成員的對齊引數)。結構體的首位址選取也滿足該條件,此時
n為結構體的對齊引數。關於結構體中成員對齊參 數:
n=min(sizeof(成員型別
),n),其中
n為編譯器中可設定的結構體成員對齊引數(
1,2,4,8,16位元組等)。整個結構體的對齊引數為
該結構體中成員的最大的對齊引數。另外,結構體的長度應為成員變數中最大對齊引數的最小整數倍(要至少足以容納所有的變
量)。舉例說明:
#include#pragma pack(8) //設定編譯器中結構體成員對齊引數為8
struct example1
;struct example2
;#pragma pack()
int main(int argc, char* argv)
;
當編譯器對齊引數設為
8byte時,則該結構體的長度為
24個位元組。
2.當結構體中有成員不是乙個完整的型別單元,而是位段時:
(位段:
c語言允許在乙個結構體中以位為單位指定其成員所佔記憶體長度,這種以位為單位的成員成為「位段」或「位域」。利用位段能夠用較少的位數儲存資料。)
對於位段成員,首先按其型別分配空間,如
int型就分配
4個連續的儲存單元。接下來,若是相同型別的位段成員就連續存放,公用這
4個儲存單元,當該型別長度不夠用時,就
另起乙個該型別長度的儲存空間。其它分配原則不變。
eg:(
intel筆試)
#include「stdafx.h」
#include struct bit
int main(int argc,char *argv)
;str str1;
str1在記憶體中的空間分配示意圖如下:
str1在記憶體中實際表示則為:
分配過程:先定義的
a(2個位),被分配到高
16位的低位上,緊接著是
b(3個位),後面的成員分配依此類推。最後的
int型,因為是
16位,高
16位剩餘的
7個位不能容納它,
則i被分配到低
16位。
2.如果乙個位段要從下乙個位元組開始存放,可採用如下定義:
struct str
它在記憶體中對應結構如下:
另外,關於位段要知道:
一、可以定義無名位段如
unsigned :3;但該長度的空間是不可用的。
二、不能夠定義位段陣列。
三、給位段賦值時,遵循自動階段原則。即當某個位段長度為
2位時,卻被賦值為
5,則要進行截斷。
如:struct bit中有
unsigned a:2;令
bit.a=5;則此時
a的值應該為等於
1.
結構體內存分配對齊策略
win32 平台下的微軟 c編譯器 cl.exe for 80 86 的對齊策略 1 結構體變數的首位址是其最長基本型別成員的整數倍 備註 編譯器在給結構體開闢空間時,首先找到結構體中最寬的基本資料型別,然後尋找記憶體位址能是該基本資料型別的整倍的位置,作為結構體的首位址。將這個最寬的基本資料型別的...
結構體在記憶體中對齊
剛剛完成乙個檔案的遷移程式,其中遇到了結構體對齊的問題,所以拿出來說說,與各位博友們分享。我的程式很簡單,就是把之前通過乙個結構體 fwrite 到檔案 a 裡的內容讀出,然後轉給另乙個結構體儲存。程式是簡單,但我擔心的是之前把結構體 fwrite 到檔案 a 的程式對齊結構體規則是怎樣的?一定要知...
結構體在記憶體中的對齊規則
結構體在記憶體中的對齊規則 標籤 儲存 struct 測試iostream c2011 11 15 19 32 4717人閱讀 9 收藏 舉報乙個結構體變數定義完之後,其在記憶體中的儲存並不等於其所包含元素的寬度之和。例一 include using namespace std struct x c...