一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

這是為什么呢?

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

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

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

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

struct A
  {
    byte a1;
  }

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

struct A
{
  byte a1;
  int a2;
}

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

如果再添加一個(gè)字段:

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

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

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

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

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

二、如何估算類的大小

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

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

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

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

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

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

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

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

審核編輯:湯梓紅

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

    關(guān)注

    8

    文章

    3119

    瀏覽量

    75230
  • 對(duì)象
    +關(guān)注

    關(guān)注

    1

    文章

    38

    瀏覽量

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

    關(guān)注

    1

    文章

    130

    瀏覽量

    11109

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

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

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

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

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

    D功放的功耗估算

    各位大佬,如題,想問(wèn)下D功放的功耗如何估算。比如TPA3255,48V供電,PBTL時(shí),帶負(fù)載2ohm。此時(shí)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語(yǔ)言中創(chuàng)建一個(gè)結(jié)構(gòu)其實(shí)際占用的內(nèi)存空間大小是多少呢?

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

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

    是引用類型在堆上分配,的實(shí)例進(jìn)行賦值只是復(fù)制了引用,都指向同一段實(shí)際對(duì)象分配的內(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'>估算方法在速度方面可能較慢,但是在估算大視圖時(shí)精確度和可靠度較高,
    發(fā)表于 12-12 18:24 ?0次下載

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

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

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

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

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

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

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

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

    經(jīng)典 C 語(yǔ)言編程,結(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 ?1842次閱讀
    經(jīng)典 C 語(yǔ)言編程,<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 ?878次閱讀
    你是否真的了解<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>占用了多少字節(jié)?

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

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