C語言結構體占記憶體多少?如何計算結構體所佔記憶體大小

時間 2023-03-16 11:00:11

1樓:吉祥二進位制

c語言獲取變數、資料型別記憶體佔多少,使用sizeof運算子即可。

關於結構體所佔的記憶體多少,一般還要考慮對齊的問題。只所以要進行資料對齊是因為編譯器對結構的儲存的特殊處理能提高cpu儲存變數的速度,一般來說,32位的cpu記憶體以4位元組對齊,64位的cpu的以8位元組的對齊。一般可以使用#pragma pack()來指出對齊的位元組數。

比如下面的**,在debug會顯示結構體test的記憶體大小為28,如果生成release版則所佔記憶體大小為32 。

#include

#ifdef _debug

#pragma pack(4)

struct test

ss;#else

#pragma pack(8)

struct test

ss;#endif

int main(void)

2樓:匿名使用者

為了定址速度的原因,所以記憶體管理採取了位址對齊的方式,即因為結構體成員中有double型別,所以對齊採用8個位元組,也就是說成員f佔8位元組,n佔8位元組,str佔32位元組。

上面是vc預設的情況,你可以自己進行設定,方式為:在結構體型別前加上編譯預處理命令。

#pragma pack(1)

即可以顯示按位元組對齊時該結構體型別所佔記憶體位元組數,具體你可以看一下下面的例子。

#pragma pack(1)

struct data

#pragma pack() 恢復原有設定。

struct data2

ss;int main(void)

3樓:莊政警

看結果你的編譯器應該是預設8位元組對齊的,你在開頭加一句#pragma pack(4)強制4位元組對齊,那就會是你預期的結果44了。

結構體除了成員要對齊之外,結構體自身也要對齊,規則是:結構體的總大小必須是對齊係數(就是#pragma pack指定的位元組數)和該結構體內最長的基本型別長度這二者之間較小值的整數倍。(很繞口是吧)

例子這個結構體最長的基本成員是double,長度是8,那麼8位元組對齊的話,8和8之間較小的是8,那結構體必須是8的整數倍,就是48了,4位元組對齊的話4和8之間較小的是4,長度是4的倍數就是44了。

4樓:

因為存在記憶體對齊這一概念,所以得到48了。

5樓:匿名使用者

64位對齊的原因?你的作業系統和使用的編譯器要說下。

6樓:與子如初見

你使用的是什麼編譯器?

c語言中,各種型別的整型資料在記憶體中都占用4個位元組嗎

7樓:

不是。c標準並沒有具體給出規定哪個基本型別應該是多少個位元組數,而且這個也與os、編譯器有關,比如同樣是在32位作業系統,vc++的編譯器下int型別為4個位元組,而在tuborc下則是2個位元組。

整型型別在雖然16位、32位或者64位的機子各種型別並不一樣,但有幾條規則(ansi/iso制定):

short至少占用2個位元組。

int建議為乙個機器字長,32位環境下為4位元組,64位環境下為8位元組。

short的長度不能大於int,long的長度不能小於int。

8樓:匿名使用者

看機器位數的,64位機器中,short是2個位元組,int是4個位元組,long是8個位元組。32位機器各是64位機器的一半。

9樓:翦思松延揚

大哥,不是4位,是4個位元組,32位好不好。

在當前大多數編譯器裡面是將整型和長整型都設為4個位元組的。

c語言中,各種型別的整型資料在記憶體中都占用4個位元組嗎

如何計算結構體所佔記憶體大小

10樓:匿名使用者

我把位元組對齊的分為兩步:

1. 求「有效對齊值」

a). 先求成員中「最大對齊值」,即成員中最大成員的大小,如果成員中含有結構體a,則是a中最大成員的大小。

b). 求「指定對齊值」,編譯器預設為8,可以通過#pragma pack (value)指定。

有效對齊值 = 最大對齊值與指定對齊值之中的較小值。

2. 各成員應按照「有效對齊值」與自身大小進行記憶體分配。

從第乙個成員開始。

a) 先分配乙個「有效對齊值」大小的記憶體空間,存放第乙個成員,如果空間不夠,則擴大空間,但擴大後必須是「有效對齊值」的整數倍;如果足夠存放,看能不能容納下乙個成員,如果能就存放下乙個成員,如果不能則再分配乙個「有效對齊值」記憶體空間,前面的記憶體空間有多餘沒有利用的填充(padding)起來。

b) 後面每乙個成員重複步驟a)

c) 最後乙個成員如果比較小,不能滿足 整個結構體的大小%有效對齊值 = 0,那麼填充空餘的部分,使其整個結構體的大小%有效對齊值 = 0。

網上有很多類似的計算,原理都差不多,這個是我自己理解的,感覺還是比較易懂,按照這種方法試過很多結構體的計算,準確率100%。

c語言結構體求解,C語言結構體求解。。

兩個資料之間沒有分隔符,可以做如下修改 同理,你下面的printf兩個資料之間最好也加上分隔符 stu 0 score 0 stu 0 score 1 stu 0 score 2 a stu 1 score 0 stu 1 score 1 stu 1 score 2 b stu 2 score 0 ...

c語言結構體型別,C語言結構體型別

遞迴是呼叫自身,資料結構裡的鍊錶定義裡邊是結構體指標,而非結構體自身,不是遞迴呼叫。線性表單鏈表並沒有遞迴呼叫啊,他是用指標指向下乙個鍊錶struct lnode next 你去在理解下遞迴思想。呵呵,前面的都沒說到問題的本質.建議你先去了解下什麼是指標,什麼是指標變數.因為指標變數是存放指標的,並...

c語言結構體初始化,C語言結構體裡的結構體怎麼初始化

你已經定義了乙個mem1,下一句又定義了乙個mem1,所以它會提示你多次定義了,應該把第二個struct mem去掉吧 struct mem mem1 變成 mem1 估計是vc6.0 把它當做c 來處理了 一眼就看出問題了。去掉倒數第三行 mem1 前面的struct mem 就解決了 c語言結構...

C語言基礎結構體問題!跪求,C語言基礎結構體問題!跪求!!!

include include struct people int main int i,temp,k for i 0 i 4 i for i 1,k 0,temp p 0 point i 4 i if p i point typedef struct playerplayer 定義這樣的結構體,給...

c語言結構體的題型急急急,C語言結構體題目

st結構體由兩個成員組成,即int型變數x與int 型變數y陣列a有3個元素構成,每個元素均為st型別 因此,對於a的初始化可以像題目中那麼寫,依次為3個元素的6個成員賦值,等價於 a 0 x 50 a 0 y dt 0 a 1 x 60 a 1 y dt 0 a 2 x 70 a 2 y dt 0...