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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

c语言求占用内存sizeof,C语言中sizeof的用法

發布時間:2023/11/27 生活经验 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言求占用内存sizeof,C语言中sizeof的用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

定義: sizeof是神圣的sizeof,它是C / C ++中的運算符. 簡而言之,其功能是返回對象或類型占用的內存字節數. MSDN上的解釋是: sizeofkeyword給出字節,關聯的類型(包括聚合類型). 關鍵字返回typeize_t. 它的返回值類型是size_t,在頭文件stddef.h中定義. 該值取決于編譯系統. 通常定義為typedef unsigned int size_t;世界上有許多編譯器,但是作為一個規范,它們將確保char,有符號字符和無符號字符的大小為1,畢竟,char可用于編程. 最小的數據類型. 語法: sizeof具有三種語法形式,如下所示: sizeof(object sizeof(object sizeof(type_name sizeof(type sizeofobject; sizeof object; so,int oksizeof oksizeof(int oksizeof int; error))因為寫3可以用寫1代替,因此形式統一并減輕我們大腦的負擔,第三種書寫方式,算了吧!實際上,sizeof計算對象的大小也被轉換為對象類型的計算方式,即sizeof值相同類型的不同對象是相同的.

在這里,對象可以進一步擴展到表達式,即sizeof可以計算表達式. 編譯器根據表達式的最終結果類型確定大小,并且通常不計算表達式. 例如: sizeof(是int類型,所以它等效于sizeof(int); sizeof(3.14是double類型,2被提升為double,所以它等效于sizeof(double); sizeof也可以從一個函數調用Value,結果是該函數返回類型的大小,該函數將不會被調用,讓我們看一個完整的示例: char foo()printf(“ foo()has been call. \ N”); return intmain()size_tsz sizeof(foo()foo()的返回值類型為char,因此sz sizeof(char),foo()將不稱為printf(“ sizeof(foo()C99標準規定函數,表達式無法確定類型并且無法計算位域(bit-field)成員的sizeof值,即以下編寫是錯誤的: sizeof(foo errorvoid foo2()sizeof(foo2()errorstruct unsignedint f1 unsignedint f2 unsignedint f3 sizeof (S.f1 sizeof常量sizeof的計算是在編譯時進行的,因此它可以用作常量表達式,例如: char ary [sizeof(int ok最新的C99標準規定,也可以在運行時計算sizeof,因為以下程序在Dev中-可以在C ++中正確執行: int動態賦值函數[n]; C99還支持動態定義數組printf(“%d \ n”,sizeof(ary));好. 輸出10,但未完全實現C99標準. 該代碼在編譯器中不起作用,上述代碼在VC6中無法編譯.

因此,我們最好認為sizeof是在編譯時執行的,這樣它就不會帶來錯誤并使程序更具可移植性. sizeof基本數據類型的基本數據類型是指簡單的內置數據類型,例如short,int,long,float和double. 由于它們都是與系統有關的,因此在不同的系統下值可能會有所不同. 我們的注意,在這方面盡量不要給您的程序移植帶來麻煩. 通常,在32位編譯環境中,sizeof(int)的值為4. 指針變量sizeof已經學習了數據結構,應該知道指針是一個非常重要的概念,它記錄了另一個對象的地址. 因為它用于存儲地址,所以它當然等于計算機內部地址總線的寬度. 因此,在32位計算機上,指針變量的返回值必須為4(請注意,結果以字節為單位). 可以預期,在將來的64位系統中,指針變量的sizeof結果將為8. char * pc“ abc”; int * pi;字符串* ps;字符** ppc和pc;無效(* pf)(); //函數指針sizeof(pc結果為4sizeof(pi結果為4sizeof(ps結果為4sizeof(ppc的結果為4sizeof(pf的結果為4指針變量. )指針變量的sizeof值與指針指向的對象,正是因為所有指針變量都占用相同的內存大小,所以MFC消息處理函數使用兩個參數WPARAM,LPARAM可以傳輸各種復雜的消息結構(使用指向結構的指針).

數組的sizeof數組的sizeof等于數組占用的內存字節數,例如: char a1 []“ abc”; int a2 [3]; sizeof(a1的結果為4,在字符末尾有一個NULL終止符)字符sizeof(a2的結果為3 * 4 = 12(取決于int). 有些朋友使用sizeof作為開頭的數組元素數. 現在,您應該知道這是錯誤的,因此應該如何查找數組元素?數字很容易,通常以以下兩種方式編寫: int c1 sizeof(a1 sizeof(char總長度/單個元素的長度int c2 sizeof(a1 sizeof(a1 [0]總長度/第一個元素的長度寫在這里)讓我問,下面的c3和的值是什么?void foo3(char a3 [3])intc3 sizeof(a3 voidfoo4(char a4 [])int sizeof(a4也許您已經知道當您嘗試回答的值時c3的答案是錯誤的,是的,c3!=3. 這里,函數參數a3不再是數組類型,但將其轉換為一個指針,等效于char * a3. 為什么不仔細考慮它,我們調用函數foo1,當程序將分配te在堆棧上的大小為3的數組,不是嗎!該數組被“傳遞”,調用者只需傳遞實際參數的地址,因此a3自然是指針類型(char *),c3的值僅為4.

sizeof結構是初學者最常問的問題之一,因此有必要花更多時間在寫作上. 讓我們首先來看一個結構: struct S1字節,然后總和應該為5. 您在機器上嘗試過嗎?也許您是對的,但很可能您是錯的! VC6中的默認設置為8. 為什么我總是受傷?請不要沮喪. 讓我們考慮一下sizeof的定義-sizeof的結果等于對象或類型占用的內存字節數. 好吧,讓我們看一下S1的內存分配. 情況: S1 s1定義上述變量后,添加一個斷點,運行程序,觀察s1所在的內存,以VC6.0為例,您發現什么,s1的地址為0x0012FF78,其數據內容如下所示: 0012FF78: 61 CC CC CC FF FF FF FF FF FF發現了CC發生了什么,中間有3個字節. 查看MSDN上的說明: 當應用structuretype變量時,sizeof返回實際大小,其中可能包括插入的填充字節對齊. 這就是傳說中的字節對齊!一個重要的話題出現了.

為什么需要字節對齊. 計算機組成原理告訴我們,這有助于加快計算機的訪問速度,否則將花費更多的指令周期. 因此,編譯器將默認處理結構(實際上,其他地方的數據變量也是如此),將基本數據類型的寬度設置為2(短整除地址,依此類推). 兩個數字的中間,您可能需要添加填充字節,因此整個結構的sizeof值已經增加. 讓我們交換char和int在S1中的位置: 結構S2看看sizeof(S2)的結果是什么,如何仍然看存儲器8,原始成員c后面還有3個填充字節,這就是為什么不用擔心,下面總結這些規則: 字節對齊的細節與編譯器的實現有關,但是通常,要滿足三個條件: 每個結構成員相對于該結構的第一個地址的偏移量是成員大小的整數倍;如果有必要,編譯器將在成員之間添加內部字節;結構就是結構整數倍最廣泛的基本類型成員的大小. 如有必要,編譯器將在最后一個成員之后添加尾隨填充. 對于上述標準,有幾點需要解釋: 該點存在,因此我們可以只考慮成員的偏移量,這很容易想到. 想一想為什么. 結構成員相對于結構的第一個地址的偏移量可以通過宏offsetof()獲得,該宏也定義在stddef.h中,如下所示: #define offsetof(s,m)(size_t)& (((s偏移量,方法為size_t pos pos等于4. 基本類型是指前面提到的字符,如char,short,int,float,double等. 'S內置數據類型,此處的“數據寬度”是指到它的sizeof大小.

由于結構的成員可以是復合類型,例如另一個結構,因此在查找最寬的基本類型成員時,應包括復合類型成員的子成員,而不是將復合成員視為整個. 但是,在確定復合類型的構件的偏移位置時,將復合類型視為一個整體. 這里的描述有點草率,想起來也有點草草,讓我們看一下示例(具體值仍然是VC6作為示例,以后將不再說明): struct S3 charc1; S1 charc2 S1的最寬簡單成員的類型為int當S3考慮最寬的簡單類型成員時,S1“中斷”,因此S3的最寬簡單類型為int,因此變量存儲空間的第一個地址由S3定義的值需要除以4,整個sizeof(S3)的值也應可整除. c1的偏移量是0,而s的偏移量現在是一個整數. 作為結構變量,它還滿足前三個條件,因此其大小為8,偏移量為4,在c1 3個填充字節和c2 12之間是必需的,將c2的大小計為13、13不是填充字節. 最后,sizeof(S3)的值為16. 通過上面的描述,我們可以得出一個公式: 結構的大小等于最后一個成員的偏移量加上它的大小加上末尾的填充字節數,即: sizeof(struct offsetof(最后一項sizeof(最后一項sizeof(尾隨填充))在這里,朋友應該對結構的sizeof有新的了解,但不要太高興,這會對具有沒有被提及,那就是編譯器的pack指令.

它用于調整結構的對齊方式. 不同編譯器的名稱和用法略有不同. 在VC6中,它是通過#pragma pack實現的. 您也可以直接修改/ Zp編譯開關. #pragma pack的基本用法是: #pragma pack(是字節對齊數,其值為1、2、4、8、16,默認值為8,如果該值小于結構的sizeof值成員的偏移量應基于此值,也就是說,結構成員的偏移量應取兩者中的最小值,公式如下: offsetof(item sizeof(item查看示例: #pragma pack(push)將當前包設置保存在堆棧上#pragma pack(2)//必須先使用struct S1 structS3 charc1; S1 charc2 #pragmapack(pop)來還原以前的包設置,然后再計算結構sizeof (S1),min(2,sizeof(i)的值)是2,因此i的偏移量是2,加上sizeof(i)等于6,可以除以2,因此整個S1的大小是6類似地,對于sizeof(S3),s的偏移量是2,c2的偏移量是8,加上sizeof(c2)等于9,無法除以2,并且添加了填充字節,因此sizeof(S3)等于10.

現在,朋友可以輕松呼吸: )還有一點要注意,“空結構”(不包括數據成員)的大小不是0,而是1. 想象一下如何解決“空閑空間”變量并如何區分兩個不同的“空結構”變量. 因此,還必須存儲“空結構”變量,以便編譯器可以為空間占用分配一個字節的空間. 如下: struct S5 sizeof(S5包含位域結構的sizeof前面已經說過,不能單獨取位域成員的sizeof值,我們在這里討論包含位域的sizeof結構,僅考慮其特殊性. 具體列出. C99規定int,unsigned int和bool可以用作位字段類型,但幾乎所有編譯器都對其進行了擴展,以允許存在其他類型. 使用位字段的主要目的是壓縮存儲空間. 一般規則是: 相鄰位字段的類型相同,并且它們的位寬之和小于該類型的大小,接下來的字段將在前一個字段之前存儲,直到無法容納為止;類型相同,但是其位寬度的總和大于該類型的sizeof的大小,則以下字段將從新的存儲單元開始,并且偏移量是其類型大小的整數倍;具體的i每個編譯器的實現都不同. VC6采用未壓縮模式,而Dev-C ++采用壓縮模式. 整個結構的總大小是最寬的基本類型成員的大小的整數倍.

讓我們看一個例子. 示例1: 結構BF1 charf1 charf2 charf3的內存布局為: _f1__ | __f2__ | _ | ____ f3 ___ | ____ | 1316位字段類型為char,第一個字節只能容納f1和f2,因此f2被壓縮為第一個字節. 在1個字節中,f3只能從下一個字節開始. 因此,sizeof(BF1)的結果為2. 示例2: 結構BF2 charf1 shortf2 charf3由于相鄰位字段的類型不同sizeof計算結構體大小,因此在VC6中其sizeof為6,在Dev-C ++中為2. 示例3: 結構BF3 charf1 charf2; char f3非位字段散布在其中,不會產生壓縮,在VC6和Dev-C ++中獲得的大小為3. 聯合的sizeof結構在內存組織中是順序的sizeof計算結構體大小,并且聯合是重疊的. 每個成員共享一部分內存,因此整個聯合的sizeof是每個成員的最大sizeof. 結構的成員也可以是復合類型. 在這里,復合類型成員被視為一個整體. 因此,在以下示例中,U的sizeof值等于sizeof(s). 聯合

本文來自電腦雜談,轉載請注明本文網址:

http://www.pc-fly.com/a/jisuanjixue/article-229320-1.html

總結

以上是生活随笔為你收集整理的c语言求占用内存sizeof,C语言中sizeof的用法的全部內容,希望文章能夠幫你解決所遇到的問題。

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