在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

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

開關(guān)電源芯片 ? 來(lái)源:程序喵大人 ? 作者:程序喵大人 ? 2021-08-23 09:37 ? 次閱讀

之前寫過一篇《如何設(shè)計(jì)一個(gè)C++的類》,今天這里繼續(xù)聊聊如何設(shè)計(jì)結(jié)構(gòu)體,注意本文不介紹在C++中結(jié)構(gòu)體和類具體有什么區(qū)別,本文所說的結(jié)構(gòu)體是指只有數(shù)據(jù)字段不帶任何函數(shù)的那種結(jié)構(gòu)體。

當(dāng)創(chuàng)建結(jié)構(gòu)體的實(shí)例時(shí),結(jié)構(gòu)體的數(shù)據(jù)成員會(huì)按其聲明的順序連續(xù)存儲(chǔ)。然而,這個(gè)聲明的順序也是有學(xué)問的,順序不同結(jié)構(gòu)體的大小可能有很大差別,數(shù)據(jù)成員的訪問性能也可能會(huì)有很大區(qū)別!

這里涉及一個(gè)概念:內(nèi)存對(duì)齊。關(guān)于內(nèi)存對(duì)齊我之前寫過一篇文章:《內(nèi)存對(duì)齊》,這里不深入討論,只是簡(jiǎn)單介紹一下。

大多數(shù)編譯器會(huì)對(duì)齊數(shù)據(jù)成員,會(huì)以四舍五入地址方式來(lái)優(yōu)化數(shù)據(jù)的訪問,如下表所示。

0c708e52-02f8-11ec-9bcf-12bb97331649.jpg

這種內(nèi)存對(duì)齊可能會(huì)在成員大小混合的結(jié)構(gòu)體中產(chǎn)生未使用字節(jié)的空洞。

例如:

struct S {

short int a; // 2字節(jié)

// 6個(gè)空洞

double b; // 8

int d; // 4

// 4個(gè)空洞

};

S ArrayOfStructures[100];

這里,在a和b之間有6個(gè)未使用的字節(jié),因?yàn)閎必須從一個(gè)能被8整除的地址開始。

最后還有4個(gè)未使用的字節(jié)空洞。這樣做的原因是,數(shù)組中S的下一個(gè)實(shí)例必須從一個(gè)能被8整除的地址開始,以便將其b成員以8對(duì)齊。

然而,如果改變一下結(jié)構(gòu)體中數(shù)據(jù)成員聲明的順序,通過將最小的成員放在最后,未使用的字節(jié)數(shù)可以減少到2:

struct S {

double b; // 8

int d; // 4

short int a; // 2

// 2個(gè)空洞

};

S ArrayOfStructures[100];

這種重新排序使結(jié)構(gòu)體變小了8個(gè)字節(jié),那整個(gè)數(shù)組則變小了800個(gè)字節(jié)。

在此特性上,類和結(jié)構(gòu)體相同。通過重新排序數(shù)據(jù)成員,結(jié)構(gòu)體對(duì)象和類對(duì)象通常可以變得更小。如果類至少有一個(gè)虛成員函數(shù),則在第一個(gè)數(shù)據(jù)成員之前或最后一個(gè)成員之后會(huì)有一個(gè)指向虛函數(shù)表的指針。該指針在32位系統(tǒng)中為4字節(jié),在64位系統(tǒng)中為8字節(jié)。

如果不確定結(jié)構(gòu)體或它的每個(gè)成員有多大,可以使用sizeof操作符進(jìn)行一些測(cè)試。sizeof操作符返回的值包括對(duì)象末尾的任何未使用的字節(jié)(內(nèi)存對(duì)齊后的字節(jié)數(shù))。

還有一個(gè)知識(shí)點(diǎn):

如果數(shù)據(jù)成員相對(duì)于結(jié)構(gòu)體或類開頭的偏移量小于128,則訪問數(shù)據(jù)成員的代碼會(huì)更加緊湊,因?yàn)樵撈屏靠梢允褂?位有符號(hào)的數(shù)字來(lái)表示。如果相對(duì)于結(jié)構(gòu)體或類的開頭的偏移量是128字節(jié)或更多,那么偏移量必須表示為一個(gè)32位數(shù)字(指令集在8位到32位之間沒有偏移量)。例如:

struct S {

int a[100]; // 400

int b; // 4

int read() { return b; }

};

b成員的偏移量是400。任何通過指針或成員函數(shù)訪問b字段的代碼都需要將偏移量編碼為32位數(shù)字。如果交換a和b,則兩者都可以通過編碼為8位有符號(hào)數(shù)字的偏移量來(lái)訪問,或者根本不需要偏移量。

這會(huì)使代碼更緊湊,方便更有效地使用代碼緩存。因此,建議在結(jié)構(gòu)或類聲明中,大數(shù)組和其他大對(duì)象排在最后,最常用的數(shù)據(jù)成員排在前面。如果不能在前128個(gè)字節(jié)內(nèi)包含所有數(shù)據(jù)成員,則將最常用的成員放在前128個(gè)字節(jié)中。

通過上面兩個(gè)小知識(shí)點(diǎn)可以使得將結(jié)構(gòu)體設(shè)計(jì)的更小,訪問數(shù)據(jù)成員的速度更快,但是這有時(shí)往往會(huì)犧牲一些可讀性,比如這種結(jié)構(gòu)體:

struct S {

int deskA;

double deskB;

bool deskC;

int chairA;

double chairB;

bool chairC;

};

可能這樣修改后結(jié)構(gòu)體會(huì)更小:

struct S {

int deskA;

int chairA;

double deskB;

double chairB;

bool deskC;

bool chairC;

};

但是我們一般情況下貌似希望同類的字段放在一起,這樣代碼可讀性更高一些,易于讀懂代碼。至于這種結(jié)構(gòu)體具體需不需要重新排序,那就需要大家自己權(quán)衡啦。

小總結(jié):

注意內(nèi)存對(duì)齊;

128是個(gè)檻,常用的數(shù)據(jù)成員可考慮放在前128字節(jié)中,不常用的或大的數(shù)據(jù)成員可考慮放在后面;

注重性能優(yōu)化的同時(shí)也需要權(quán)衡一下代碼的可讀性。

打完收工。

責(zé)任編輯:haq

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

    關(guān)注

    38

    文章

    7641

    瀏覽量

    166643
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3115

    瀏覽量

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

    關(guān)注

    1

    文章

    130

    瀏覽量

    11060

原文標(biāo)題:如何設(shè)計(jì)結(jié)構(gòu)體

文章出處:【微信號(hào):gh_3980db2283cd,微信公眾號(hào):開關(guān)電源芯片】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

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

    滲壓計(jì)在混凝土結(jié)構(gòu)中的安裝指南

    在現(xiàn)代土木工程和巖土工程中,滲壓計(jì)是監(jiān)測(cè)混凝土結(jié)構(gòu)體內(nèi)孔隙水壓力變化的重要工具。南京峟思公司生產(chǎn)的滲壓計(jì)因其高精度和可靠性而被廣泛應(yīng)用于各種工程監(jiān)測(cè)項(xiàng)目中。一、滲壓計(jì)在混凝土結(jié)構(gòu)中的應(yīng)用價(jià)值滲壓計(jì)
    的頭像 發(fā)表于 05-28 10:55 ?112次閱讀
    滲壓計(jì)在混凝土<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>中的安裝指南

    使用USB控制中心通過FX3將數(shù)據(jù)傳輸?shù)紻SP,數(shù)據(jù)字丟失怎么解決?

    使用傳輸文件-輸出功能時(shí), DMABuf1[0] 中的第一個(gè)數(shù)據(jù)字錯(cuò)誤地為 0x0000,最后一個(gè)數(shù)據(jù)字 0x27FF 丟失。 有趣的是,如果我重新發(fā)送同一個(gè)文件,收到的第一個(gè)單詞就是之前丟失
    發(fā)表于 05-21 07:31

    程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)

    《程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》重點(diǎn)闡述了三大方向內(nèi)容: 1. C語(yǔ)言學(xué)習(xí)中的痛點(diǎn):針對(duì)當(dāng)前工程師在C語(yǔ)言學(xué)習(xí)中的痛點(diǎn),如指針函數(shù)與函數(shù)指針,如何靈活應(yīng)用結(jié)構(gòu)等。從變量的三要素(變量的類型,變量的值和變量
    發(fā)表于 05-13 16:45

    C語(yǔ)言中結(jié)構(gòu)與聯(lián)合體的深度解析:內(nèi)存布局與應(yīng)用場(chǎng)景

    一、基礎(chǔ)概念與核心差異 1.1 結(jié)構(gòu)(Struct)的本質(zhì) **結(jié)構(gòu)是C語(yǔ)言中實(shí)現(xiàn)數(shù)據(jù)封裝的基石,其核心特征在于內(nèi)存獨(dú)立性。每個(gè)成員變量
    發(fā)表于 04-08 09:18

    ADS1293在中斷采用Stream mode讀取數(shù)據(jù)數(shù)據(jù)字節(jié)數(shù)不對(duì)是哪里出了問題?

    mode讀取數(shù)據(jù)(按照datasheet33頁(yè)的介紹做的),發(fā)現(xiàn)數(shù)據(jù)字節(jié)數(shù)不對(duì),后用示波器測(cè)量此時(shí)DRDYB管腳變成200Hz方波了; 3、使用的配置DRDYB_SRC_REG(地址0x27)的值是0x08, CH_CNFG_REG(地址0x2F)值是0x70。 不知道
    發(fā)表于 01-13 08:32

    LDC1000 Frequency Data只有最低數(shù)據(jù)有數(shù)據(jù)其他2位都是0x00,為什么?

    Frequency Data只有最低數(shù)據(jù)有數(shù)據(jù)其他2位都是0x00,我想問下我這問題出在哪里?我的參數(shù)設(shè)置: RpMAX=0x13;//21.547 RpMIN=0x3d; //1.347
    發(fā)表于 01-06 07:33

    ADS5547, DAC8822時(shí)序圖上只有數(shù)據(jù)在寄存器之間轉(zhuǎn)換的時(shí)序,難道更新速率只和數(shù)據(jù)在寄存器之間轉(zhuǎn)換時(shí)間有關(guān)嗎?

    ADS5547, DAC8822時(shí)序圖上只有數(shù)據(jù)在寄存器之間轉(zhuǎn)換的時(shí)序,難道更新速率只和數(shù)據(jù)在寄存器之間轉(zhuǎn)換時(shí)間有關(guān)嗎?
    發(fā)表于 12-20 07:28

    ADS7953SDBTR上電時(shí)16個(gè)通道中,只有4個(gè)通道有數(shù)據(jù),其余12個(gè)通道無(wú)數(shù)據(jù),怎么解決?

    請(qǐng)教一下,我現(xiàn)在有用一個(gè)16通道的模數(shù)轉(zhuǎn)換器ADS7953SDBTR,使用過程中出現(xiàn)了一個(gè)問題,第一次上電的時(shí)候只有4個(gè)通道有數(shù)據(jù),其它12個(gè)通道沒有數(shù)據(jù),然后掉電重啟,16個(gè)通道都正常了,檢測(cè)了
    發(fā)表于 12-06 07:26

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

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

    AD7686芯片不傳輸數(shù)據(jù)給STM32,但是手按住就會(huì)有數(shù)據(jù)

    AD7686芯片不傳輸數(shù)據(jù)給STM32,但是手按住就會(huì)有數(shù)據(jù)
    發(fā)表于 11-16 21:12

    AFE4403在采集血氧數(shù)據(jù)時(shí)不夠平滑,會(huì)有數(shù)據(jù)波動(dòng),為什么?

    在采集血氧數(shù)據(jù)時(shí)不夠平滑,會(huì)有數(shù)據(jù)波動(dòng)
    發(fā)表于 11-15 07:46

    C語(yǔ)言和C++中結(jié)構(gòu)的區(qū)別

    同樣是結(jié)構(gòu),看看在C語(yǔ)言和C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?695次閱讀

    PCM1865-Q1在LRCK低電平時(shí)只有DOUT2有數(shù)據(jù),DOUT沒有數(shù)據(jù),為什么?

    4.GPIO3 作為DOUT2接口 5.四個(gè)ADC通道,均采用單端輸入方式, 現(xiàn)遇到問題如下: 如圖:WS是LRCK,SCLK是BCK ,SDATA是DOUT , D14是DOUT2 具體問題是 在LRCK低電平時(shí)只有DOUT2有數(shù)據(jù),DOUT沒
    發(fā)表于 10-29 06:25

    TLV320aic3101的TDM設(shè)置,想用TDM采集所有數(shù)據(jù),請(qǐng)問怎樣設(shè)置?

    請(qǐng)教TLV320aic3101的TDM設(shè)置,現(xiàn)在我接了兩路聲音,一共4聲道到一片TLV320aic3101,想用TDM采集所有數(shù)據(jù),請(qǐng)問怎樣設(shè)置?現(xiàn)在我已經(jīng)打開了256-clock,發(fā)現(xiàn)只有其中
    發(fā)表于 10-24 07:34

    ota升級(jí)的庫(kù)中,結(jié)構(gòu)upgrade_server_info中pespconn的作用是什么?

    check_cb; struct espconn *pespconn; }; 這個(gè)結(jié)構(gòu)中已經(jīng)有ip,port,pespconn這個(gè)結(jié)構(gòu)
    發(fā)表于 07-12 06:33
    主站蜘蛛池模板: 国产拍拍拍免费视频网站 | 狠狠色丁香久久婷婷综 | kkk4444免费观看 | 日本色视 | 成人国产激情福利久久精品 | 久久永久视频 | 在线免费视频手机版 | 色婷婷狠狠干 | 永久免费精品视频 | 天天操天天做 | 国产激情在线观看 | 欧美午夜视频一区二区 | 四虎影视在线影院4hu | 日韩欧美一级 | aaaa欧美高清免费 | 午夜欧美电影 | 久久婷婷激情综合色综合也去 | 久操视频在线播放 | 国产精品你懂的在线播放 | 黄色xxxx| 嫩草影院久久国产精品 | 免费特黄 | 四虎影院网址大全 | 一级片在线播放 | 99久久99| 国产欧美亚洲精品第二区首页 | 国产乱码一区二区三区四川人 | 国产综合精品久久亚洲 | 久久久久久国产精品mv | 黄色在线播放网站 | 久久久综合久久 | 中文字幕在线观看一区二区三区 | 国产黄色大全 | 久久15 | 欧美人与禽 | xxxx日本69护士| 免费黄色地址 | 国产成人精品曰本亚洲78 | 色狠狠色综合久久8狠狠色 色狠狠网 | 一级特黄aa大片免费播放视频 | h黄视频|