日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c 定义结构体时提示应输入声明_C++|了解结构体的内存对齐(成员声明的顺序影响占用空间大小)...

發布時間:2024/7/23 c/c++ 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c 定义结构体时提示应输入声明_C++|了解结构体的内存对齐(成员声明的顺序影响占用空间大小)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們使用的電子計算機絕大部分都是馮·諾依曼結構的機器,遵循“存儲程序”的概念。數據處理以存儲為前提,在編程中數據如何“存得進去,取得出來”,并且符合空間、時間效率的要求,在考慮數據結構和算法時,都要有清晰的內存映像的圖景。

你可以想像在定義一個結構體時,就是在構建一塊內存空間的架構。當定義結構體變量時,就會實際分配內存空間,這塊內存空間的首地址就是結構體變量的名稱,各成員變量名對應各小塊空間的首地址。訪問各成員變量使用的點號,就如同是大塊空間的地址到成員空間的映射或偏移。

如以下定義的結構體:

#includestruct Readout {char hour;int value;char seq;}testSize;void main(){std::cout<

你可能會想到以下的內存映像圖景(以下都是假設32位,int類型占用4個字節長度的機器):

可能會認為以下代碼的輸出應該是6(各成員大小的和)。

std::cout<

但實際的輸出卻是12。這就是結構體的內存對齊,編譯器會自動對齊結構體數據成員以提高運行效率。

結構體的字節對齊是指編譯器在為結構體變量分配內存時,保證下一個成員的偏移量為成員類型的整數倍。因此,對于一些結構體變量來說,其大小并不等于結構體中每一個成員大小的總和。編譯器基于效率因素增加一些額外字節以使存儲邊界對齊。

這樣會在內存中留下一些“空洞”而增加了內存空間的占用:

這也就解釋了內存空間占用是12而不是6的原因。

您可以通過簡單地按大小(首先是最大的成員)對成員排序來最小化浪費的空間。

struct Readout {int value;char hour;char seq;}testSize;void main(){std::cout<

此時的內存占用是8個字節:

也就是說,因為對齊的原因,還是留下了一些內存“空洞”。

如果是以下結構定義,size也是8:struct Readout {char hour;char seq;int value;}testSize;

通過以下語句可以強制地聲明結構體內存對齊的長度,如:

#pragma pack(1) //C編譯器按n字節對齊。

如果有聲明以上語句,則下面語句的輸出就是6了:

std::cout<

基本的規則是:

結構體每個成員相對于結構體首地址的偏移量(offset)都是成員大小的整數倍,如有需要,編譯器會在成員之間加上填充字節;

結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要編譯器會在在最末一個成員之后加上填充字節。

-End-

總結

以上是生活随笔為你收集整理的c 定义结构体时提示应输入声明_C++|了解结构体的内存对齐(成员声明的顺序影响占用空间大小)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。