chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何估算結(jié)構(gòu)體和類的大小

Q4MP_gh_c472c21 ? 來源:IT檔案館 ? 作者:IT檔案館 ? 2022-10-13 13:40 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

你做的模塊,測試反饋說,進(jìn)去就卡頓,按鈕點(diǎn)擊半天才反應(yīng)。

這是為什么呢?

要想知道這個問題的答案,首先需要搞懂怎樣估算對象和結(jié)構(gòu)體的大小。

一、如何估算結(jié)構(gòu)體的大小

結(jié)構(gòu)是值類型,它的結(jié)構(gòu)體的實(shí)例是存放在棧中或者堆中。

結(jié)構(gòu)體在內(nèi)存中所占的大小,就是其字段所占的大小,但是,它的大小并不是所有字段大小相加,而是存在一個對齊的規(guī)則,在默認(rèn)的對齊規(guī)則中,基本類型字段是按照自身大小對齊的,如byte是按1字節(jié)對齊。

struct A
  {
    byte a1;
  }

如上面這個結(jié)構(gòu)體的大小就是1字節(jié),如果是下面這個:

struct A
{
  byte a1;
  int a2;
}

這個結(jié)構(gòu)體所占內(nèi)存大小是8字節(jié),因?yàn)閕nt是4字節(jié)對齊的,所以只能從第四個字節(jié)開始。

如果再添加一個字段:

struct A
{
byte a1;
int a2;
byte a3;
}

這個結(jié)構(gòu)體大小是12,由于struct本身也要是對齊的,所以它的對齊規(guī)則是按照其中元素最大的對齊規(guī)則決定的。也就是說上面這個結(jié)構(gòu)體要按照4字節(jié)對齊,不足4字節(jié)要補(bǔ)齊,所以是12個字節(jié)大小。

如果想要優(yōu)化它的大小,可以調(diào)整順序如下:

struct A
{
  byte a1;
  byte a3;
  int a2;
}

這個時候這個結(jié)構(gòu)體所占的大小就是8字節(jié)了。

二、如何估算類的大小

類是引用類型,它的對象實(shí)例存放在堆中,對象實(shí)例一定是會占用堆內(nèi)存的,而在棧中,保存的是實(shí)例的引用。對象在堆中分成3個區(qū)域,vtable、monitor和字段。

其中vtable是類的共有數(shù)據(jù),包含靜態(tài)變量和方法表,這個應(yīng)該就是類本身所占用的大小和具體的對象無關(guān)。monitor是線程同步用的,這2個指針分別占用一個inptr.Size大小,字段是從第9個字節(jié)或17個字節(jié)開始的,字段的對齊規(guī)則和結(jié)構(gòu)體的對齊規(guī)則相同,區(qū)別是Mono中對象的實(shí)例會把引用類型的引用放在最前面。一個對象實(shí)例的大小就是 inptr.Size *2+字段的大小。

通過調(diào)整字段的順序,也可以優(yōu)化對象的大小。

還可以通過StructLayoutAttribute自定義類和結(jié)構(gòu)體的對齊方式。

[StructLayout(LayoutKind, Sequential, Pack = 1)]
public struct A
 {
  byte a1;
  int a2;
  byte a3;
 }

上面這個結(jié)構(gòu)體強(qiáng)制按照1字節(jié)對齊,所以他的大小是6字節(jié),但這樣做可能會降低性能。

所以具體情況還是要具體分析,懂得了如何估算結(jié)構(gòu)體和類的大小,就更容易知道該如何使用它們了。

我們的目標(biāo)就是讓測試下崗,因?yàn)闆]有BUG他就沒工作了。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3125

    瀏覽量

    75270
  • 對象
    +關(guān)注

    關(guān)注

    1

    文章

    38

    瀏覽量

    17554
  • 結(jié)構(gòu)體
    +關(guān)注

    關(guān)注

    1

    文章

    131

    瀏覽量

    11115

原文標(biāo)題:為什么你寫的代碼占用內(nèi)存這么大?

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    C語言結(jié)構(gòu)(struct)常見使用方法

    ; int c; }相應(yīng)的,64位機(jī)按8字節(jié)對齊。不過對齊不是絕對的,用#pragma pack()可以修改對齊,如果改成1,結(jié)構(gòu)大小就是實(shí)實(shí)在在的成員變量大小的總和了。和C++的
    發(fā)表于 08-23 18:18

    C++筆記004:C++通俗點(diǎn)說—— C結(jié)構(gòu)復(fù)習(xí)

    ` 本帖最后由 tyyhmtyyhm 于 2018-5-12 09:37 編輯 C++通俗點(diǎn)說—— C結(jié)構(gòu)復(fù)習(xí)核心:C++的就是對C語言的
    發(fā)表于 03-05 12:53

    漫談C語言結(jié)構(gòu)

    不是8 byte?! ∷?,結(jié)構(gòu)成員變量的放置順序影響著結(jié)構(gòu)所占的內(nèi)存空間的大小。一個結(jié)構(gòu)
    發(fā)表于 11-15 15:59

    D功放的功耗估算

    各位大佬,如題,想問下D功放的功耗如何估算。比如TPA3255,48V供電,PBTL時,帶負(fù)載2ohm。此時48V需要供電多少電流,TPA3255本身的功耗大概是多少?
    發(fā)表于 09-10 19:06

    消息隊(duì)列傳遞結(jié)構(gòu)指針和結(jié)構(gòu)異同

    FreeRTOS消息隊(duì)列 傳遞結(jié)構(gòu)指針和結(jié)構(gòu)異同1 消息隊(duì)列傳遞結(jié)構(gòu)指針和
    發(fā)表于 02-11 07:02

    C語言中創(chuàng)建一個結(jié)構(gòu)其實(shí)際占用的內(nèi)存空間大小是多少呢?

    際占用的內(nèi)存空間大小是多少呢?示例代碼如下:struct S{int i;char c;int j;};要正確計(jì)算結(jié)構(gòu)大小,首先需要了解數(shù)據(jù)對齊的原理。數(shù)據(jù)對齊
    發(fā)表于 09-29 11:57

    結(jié)構(gòu)的區(qū)別與聯(lián)系

    是引用類型在堆上分配,的實(shí)例進(jìn)行賦值只是復(fù)制了引用,都指向同一段實(shí)際對象分配的內(nèi)存有構(gòu)造和析構(gòu)函數(shù)可以繼承和被繼承
    發(fā)表于 11-20 12:23 ?1.2w次閱讀
    <b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>和<b class='flag-5'>類</b>的區(qū)別與聯(lián)系

    用于OLAP的視圖大小估算算法比較與分析

    OLAP系統(tǒng)中的視圖物化操作,要求快速、可靠而精確。許多視圖大小估算技術(shù)利用特定的統(tǒng)計(jì)假設(shè),其誤差可能較大?;诟怕实?b class='flag-5'>估算方法在速度方面可能較慢,但是在估算大視圖時精確度和可靠度較高,
    發(fā)表于 12-12 18:24 ?0次下載

    如何設(shè)計(jì)只有數(shù)據(jù)字段的結(jié)構(gòu)

    之前寫過一篇《如何設(shè)計(jì)一個C++的》,今天這里繼續(xù)聊聊如何設(shè)計(jì)結(jié)構(gòu),注意本文不介紹在C++中結(jié)構(gòu)
    的頭像 發(fā)表于 08-23 09:37 ?1771次閱讀
    如何設(shè)計(jì)只有數(shù)據(jù)字段的<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>

    結(jié)構(gòu)基本用法詳解

      結(jié)構(gòu)就是把相同或者不同類型的便利放到一起,這和C++中的很像,但沒有c++那么復(fù)雜,C語言中的結(jié)構(gòu)申明如下。
    的頭像 發(fā)表于 02-15 14:52 ?1567次閱讀

    結(jié)構(gòu)大小的獲取

    我們使用sizeof()函數(shù)來獲取結(jié)構(gòu)大小。
    的頭像 發(fā)表于 03-14 17:30 ?1292次閱讀

    C語言計(jì)算結(jié)構(gòu)占用的空間大小

    計(jì)算以下兩個結(jié)構(gòu)所占空間大小分別是多少?
    發(fā)表于 08-24 16:03 ?682次閱讀

    經(jīng)典 C 語言編程,結(jié)構(gòu)和聯(lián)合體如何共用?

    結(jié)構(gòu) 結(jié)構(gòu)占用的內(nèi)存大小,首先和編譯器的系統(tǒng)位數(shù)有關(guān)系,類似于CPU是 64 bits 還是 32 bits 的情形;其次,
    的頭像 發(fā)表于 01-11 18:24 ?1855次閱讀
    經(jīng)典 C 語言編程,<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>和聯(lián)合體如何共用?

    你是否真的了解結(jié)構(gòu)占用了多少字節(jié)?

    結(jié)構(gòu)成員所占內(nèi)存空間大小一般情況下,如果想知道結(jié)構(gòu)成員的內(nèi)存占用情況需要:1、先用結(jié)構(gòu)
    的頭像 發(fā)表于 06-04 08:04 ?881次閱讀
    你是否真的了解<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>占用了多少字節(jié)?

    結(jié)構(gòu)成員的順序會影響結(jié)構(gòu)大小

    相同的結(jié)構(gòu)成員,如果把順序調(diào)整一下,會不會影響結(jié)構(gòu)大小? 答案是會的,這主要跟字節(jié)對齊有關(guān)。 比如這樣的
    的頭像 發(fā)表于 11-25 16:24 ?563次閱讀