1. 程式人生 > >結構體所佔空間大小的運算

結構體所佔空間大小的運算

在C/C++中我們常常會看到有求一個結構體的大小的情況,有時候我們就會想:不就是結構體中各個資料型別所佔的空間加起來就行啦,那麼事實上是不是這樣呢?答案:不是滴。原因是:為了加快讀寫資料的速度,編譯器就實現了資料對其的做法來為每一個結構體分配空間。

這裡我只講結構體中資料對其的一個要點:2倍。

2倍(本人自己總結的)是指有兩個倍數要記住,第一就是結構中的各型別的倍數,第二就是結構體這個型別的倍數。

那麼具體怎麼理解這兩個倍數呢?舉個例子就好理解了。如

struct A { char a; double b; int c; }; (說明:在VS中char佔有1個位元組,double佔了8個位元組,int佔了4個位元組) 計算的時候是這樣子的:首先是按照自上向下為結構體分配空間,並在其之間作調整。首先為char分配一個空間,接著編譯器為了實現資料的對其,所以在分配double的時候會對之前所分配的空間進行一些調整,調整方式是按照原先分配的空間的大小和當前要分配的大小來決定將要分配的空間,因為double為8位元組,所以編譯器要求在double之前所分配的空間大小應該是當期要分配的空間的倍數,在這裡也就是說在double前面分配的應該是8的倍數空間才行,所以原來的char被迫擴充套件到8個位元組,然後才為double分配8個位元組,這樣這兩個變數就佔了16位元組。接著就是到了int了,因為int需要4個位元組,而前面所分配的為16個位元組,是4的倍數,所以接著就為int分配了4個位元組,也就是到了目前編譯器為這個結構體分配了20個位元組,那麼是否就是這個答案呢?哈哈,你試一下就知道這個答案不正確,因為這只是其中的一個倍數(按照我所說的兩個倍數中的一個),那麼還有一個倍數是什麼呢?其實還有一個就是前面所說的對結構體整體的一個倍數處理,已經為結構體分配好20個位元組空間,那麼接下來就是編譯器要求整個結構體所分配的空間大小是結構體中佔用空間最多的型別所佔用空間大小的倍數,如上面的例子,結構體中佔用空間最多的就是double這種了型別,那麼就要求結構體總大小是這個型別的倍數,在這裡也就是要求結構體所佔用空間大小要是8 的倍數,因為20不是8的倍數,所以結構體被迫擴充套件自己的空間,以滿足需要,所以就擴充套件到24個位元組。所以結果為24.不知道你學會了沒有,如果有什麼不同的見解,不如在下面回覆一下,不勝感激。

相關推薦

結構空間大小運算

在C/C++中我們常常會看到有求一個結構體的大小的情況,有時候我們就會想:不就是結構體中各個資料型別所佔的空間加起來就行啦,那麼事實上是不是這樣呢?答案:不是滴。原因是:為了加快讀寫資料的速度,編譯器就實現了資料對其的做法來為每一個結構體分配空間。 這裡我只講結構體中資料對

C++中 類 和 結構記憶體大小

結構體存在記憶體對齊,類(物件)也如此,甚至於所有變數在記憶體中的儲存也有對齊一說(只是這些對程式設計師是透明的,不需要關心)。實際上,這種對齊是為了在空間與複雜度上達到平衡的一種技術手段,簡單的講,是為了在可接受的空間浪費的前提下,儘可能的提高對相同運算過程的最少(快)處理。先舉個例子:     假

記憶體對齊方式的總結 如何計算結構記憶體的大小

具體的理論內容 神馬是記憶體對齊以及為何要記憶體對齊請看http://blog.csdn.net/kokodudu/article/details/11918219 上面這個連線 將的相當理論 我給簡化了一下 但是還是必須要看的 這裡對如何計算結構體所佔記憶體大小做出總結

【C++】使用sizeof計算類物件空間大小-sizeof總結

 決定C ++中物件的大小的因素: 1.所有非靜態資料成員的大小 2.資料成員的順序 3.位元組對齊或位元組填充 4.其直接基類的大小虛擬函式的存在 5.  正在使用的編譯器 6.繼承模式(虛擬繼承) 一、使用sizeof計算類物件所佔空間大小

C++中型別的通常範圍和空間大小

重要宣告:以下表格是在  Windows10 和 Dev-C++5.11 和 g++ 和 64-bit Release  環境下測試的結果。 C++型別的範圍和所佔空間大小 型別 數

八種基本資料型別各自空間大小

在JAVA中一共有八種基本資料型別。 他們分別是byte、short、int、long、float、double、char、boolean 整型 其中byte、short、int、long都是表示整數的,只不過他們的取值範圍不一樣 byte的取值範圍為-128~127,佔用

C/C++中基本資料型別在不同系統中空間大小

關於這個基本的問題,很早以前就很清楚了,C標準中並沒有具體給出規定那個基本型別應該是多少位元組數,而且這個也與機器、OS、編譯器有關,比如同樣是在32bits的作業系統系,VC++的編譯器下int型別

linux中詳細檢視空間大小及檔案個數

統計某資料夾下檔案的個數 ls -l |grep "^-"|wc -l 統計某資料夾下目錄的個數 ls -l |grep "^d"|wc -l 統計資料夾下檔案的個數,包括子資料夾裡的 ls -lR|grep "^-"|wc -l 如統計/home/han目錄(包含子目錄)下的所有js檔案則: ls -lR

獲取元素位置資訊和空間大小(via:js&jquery)

工作中有一個很常見的需求,hover或者click某元素後,在該元素旁邊出現彈框,主要就是獲取該元素的位置座標以及元素所佔區塊的大小。最近工作中就遇到了,發現js和jquery的實現方法有很大的區別,這裡總結一下,備忘。 獲取元素的相對位置資訊 原生js方法

C語言結構占內存大小

oat 接下來 面試題 語言 將不 位置 idt str 返回 用一道面試題題引入struct str1 { char a; int b; float c; double d; };char類型占用

oracle查詢表空間大小以及每個表空間大小

1、查詢資料庫中所有的表空間以及表空間所佔空間的大小,直接執行語句就可以了: select tablespace_name, sum(bytes)/1024/1024 from dba_data_files group by tablespace_name; 2、查看

怎麼計算struct結構空間

        C語言結構體struct所佔空間的計算一直是公司筆試題中的熱點。         我們來看一下每種情況下的結構體的大小: 一、結構體成員是基本型別         總體上遵循兩個原則:        (1)、整體空間是佔用空間最大的

SQL Server檢視所有表大小空間

create table #Data(name varchar(100),row varchar(100),reserved varchar(100),data varchar(100),index_size varchar(100),unused varchar(100)

oracle如何查詢分區表空間大小

rac 查詢 part clas nts sele post segments upper select bytes/1024/1024 from user_segments where segment_type=‘TABLE PARTITION‘ and segme

iOS 如何計算圖片載入記憶體中大小

首先圖片自動縮放到2的n次方大小,例如200 * 300畫素 會變成256 * 512大小。 圖片記憶體大小的計算公式 寬度 * 高度 * bytesPerPixel/8。 bytesPerPixel : 每個畫素所佔的位元組數。 RGB顏色空間下 每個顏色分量由8位組成

C語言中指標變數位元組大小

在學習過程中知道,一個任何型別的指標變數所佔的位元組大小都為4個位元組。這是為什麼呢? 記憶體是由位元組組成的,每個位元組都有一個編號。指標變數主要是存放相同資料型別的變數的首地址。這裡的這個地址其實就是記憶體的某個位元組的編號。而這個編號的確定是與地址匯流排有關。如果地址

結構陣列位元組數大小

程式碼1: 1 struct BOOK 2 { 3 char name[5]; 4 float price; 5 }book[2];         分別計算sizeof(struce BOOK)和sizeof(book)的位元組數大小,結果分

day07 結構 匿名結構 結構的初始化 訪問 結構巢狀 結構的儲存空間 結構陣列

//結構體的定義/*  struct 結構體的定義{  資料型別成員變數1;  資料型別成員變數2;  .....  資料型別成員變數n;  }; 注意“;”  *///typedef(第一種方式)//先定義結構體,在說明結構體變數//struct myPoint{//    float x;//行座標// 

iOS基本資料型別記憶體大小

1、在swift中基本的資料型別都有哪些? Float、CGFloat、Double、float_t、Float32、Float64、Float80、double_t Int、int_fast8_t

C語言結構佔用的位元組數如何計算

結構體的資料型別的有點多我們就不囉嗦了,直接來看相同資料結構體的幾種書寫的格式吧。   格式一:     01.struct tagPhone   02.{   03.     char   A;   04.     int    B;   05.     short