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++|了解结构体的内存对齐(成员声明的顺序影响占用空间大小)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ 单例模式_Redis单例、主从模
- 下一篇: c语言用队列stl加头文件,C++ ST