struct class 和union記憶體對齊

2021-10-09 05:00:26 字數 1883 閱讀 7628

基本資料型別所佔空間(unsigned無符號型別相同):

大小足夠容納最寬的成員;

大小能被其包含的所有基本資料型別的大小所整除。

(是被資料型別的大小:1,2,4,8,不是變數大小 )

方法:記憶體大小只取決於最大的成員

找到佔空間最大的成員,取最大的空間值x

當x無法被所有的資料型別大小所整除,就補加a,使得x+a可以被所有的資料型別大小所整除

則x+a為union的大小

例1:

union union1

;

union1取最大的變數,和其他變數無關

a-----------1

b-----------2

c-----------4

d-----------8

最大的是double=8,

8 mod 1=0

8 mod 2=0

8 mod 4=0

8 mod 8=0

所以union1的記憶體大小為8

例2

union union2

;

union2取最大的變數,和其他變數無關

a-----------13

b-----------2

c-----------8

最大的是a   13

13補3=16

16 mod 1=0

16 mod 2=0

16 mod 4=0

16 mod 8=0

所以union2的記憶體大小為16

結構體在記憶體中存放是按單元存放的,

所開闢單元的最大長度取決於佔位元組最大的資料型別,

儲存順序對空間的使用率有一定的影響。方法

先找最大的是資料型別大小x

在最大的變數之前,只要不超過最大變數的長度,就堆在一起成一行

每一行不是x的倍數,就補齊到最近的x的倍數

之後加和為總的大小

例1

struct tagphone1

;

tagphone1 記憶體狀態

a            型別大小1位元組,變數大小1位元組

bbbb     型別大小4位元組,變數大小4位元組

cc          型別大小2位元組,變數大小3位元組

只用看最大的型別:int

則最小單位為4位元組,每次開闢新的單元必須是4位元組的整數倍

開闢了三行

記憶體大小為 3*4 = 12

所以tagphone1 的大小為12

例2

struct tagphone2

;

tagphone2 記憶體狀態

acc           型別大小1位元組,變數大小1位元組

bbbb     型別大小4位元組,變數大小4位元組

只用看最大的型別:int

則最小單位為4位元組,每次開闢新的單元必須是4位元組的整數倍

開闢了2行

記憶體大小為 2*4 = 8

所以tagphone2的大小為8

例3

struct tagphone3

;

tagphone3 記憶體狀態

abbcccc 

只用看最大的型別:char

所以tagphone3的大小為1+2+4=7

例4

struct tagphone4

;

tagphone4 記憶體狀態

aaaa

bbbbbbbb

ccccccccc

只用看最大的型別:double

需要成為8倍數

所以(4補4=8)+8+(9補7=16)=8+8+16=32

所以tagphone4的大小為32

C和C 中struct,class問題

在c c 中,struct結構體還是有所差別的,c中沒有class,c 中struct和class的區別就只有預設訪問許可權,預設繼承許可權.1.c 中,class和struct的區別 1.成員訪問許可權 class的成員訪問許可權為private,而struct的成員訪問許可權為public 2....

struct class和STL的統一記憶體管理

利用c 的new和delete操作符過載特性,可以對自定義的struct和class進行統一記憶體管理,再加上stl allocator的開放特性,便可以將stl容器物件的記憶體管理併入struct和class的記憶體管理,進而將這三者的記憶體管理統一。首先實現自定義的記憶體管理演算法框架,開放介面...

C 學習 原創 unique和uni

c 學習 原創 unique和unique copy函式的應用 孫宇洪 unique函式的功能是 去除相鄰的重複元素 只保留乙個 函式引數 unique first,last,compare first為容器的首迭代器,last為容器的末迭代器,compare為比較函式 可略寫 注意 unique函...