sizeof 結構體 的分析

2021-09-12 13:44:57 字數 1590 閱讀 7201

一、為什麼結構體計算這麼亂?

答案是位元組對齊,計算機儲存系統中以byte為單位儲存資料,不同資料型別所佔的空間不同,如:整型(int)資料佔4個位元組,字元型(char)資料佔乙個字 節,

4整除的起始位置,字元型資料(char)可以存放在任何位址位置(被1整除),短整型(short)資料儲存在位址能被2整除的起始位置。這樣位元組對齊有助於加快

計算機的取數速度,否則就得多花指令週期了。

1. 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;

2. 結構體每個成員相對於結構體首位址的偏移量都是當前成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組;

3. 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組。

說明:1、基本型別是指前面提到的像char、short、int、float、double這樣的內建資料型別;

2、對於復合資料型別,如結構體巢狀結構體,那麼基本型別是指前面提到的像char、short、int、float、double這樣的內建資料型別;

3、我認為計算結構體大小的時候,主要用到準則2和準則3,對於準則1是編譯器自動完成的,不需要過多理會。

4、c++中類的可以看做是特殊的結構體,所以類的sizeof的計算和結構體是一樣的。

三、下面拿具體的程式來詳細說明:

型別一:

// sizeof(結構體).cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#includeusing namespace std;

struct a

;struct b

;int _tmain(int argc, _tchar* ar**)

ss;

char a; //3

char b; //4

char d; //5

char e; //6

char f; //7

}

解析:stu5結構體在記憶體的分布如下圖,經過在vs中測試,正確。

型別三、含有陣列結構體

struct ss  

; cout解析:sizeof(ss)大小是20,結構體ss中三種基本型別:float/char/int,sizeof(f)=4,sizeof(p)=1,sizeof(adf)=4*3=12;所以總的大小是17,根據上面的原則3,是最寬位元組的整數倍,所以是20位元組。

型別四、巢狀兩個結構體和成員變數

struct stu1

; struct ss

; struct mystruct

; cout << sizeof(mystruct) << endl;

結構體的sizeof

本文主要包括二個部分,第一部分重點介紹在vc中,怎麼樣採用sizeof來求結構的大小,以及容易出現的問題,並給出解決問題的方法,第二部分總結出vc中sizeof的主要用法。1 sizeof應用在結構上的情況 請看下面的結構 struct mystruct 對結構mystruct採用sizeof會出現...

結構體,公用體,列舉型別的sizeof

1 列舉類enum型空間計算 enum只是定義了乙個常量集合,裡面沒有 元素 而列舉型別是當做int來儲存的,所以列舉型別的sizeof值都為4 1 enum color red,pink,white,black c 2void main 3 2 公用體union空間計算 公用體中的成員公用同一段記...

結構體,公用體,列舉型別的sizeof

1 列舉類enum型空間計算 enum只是定義了乙個常量集合,裡面沒有 元素 而列舉型別是當做int來儲存的,所以列舉型別的sizeof值都為4 1 enumcolor red,pink,white,black c 2 voidmain 3 2 公用體union空間計算 公用體中的成員公用同一段記憶...