女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何設計只有數據字段的結構體

開關電源芯片 ? 來源:程序喵大人 ? 作者:程序喵大人 ? 2021-08-23 09:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

之前寫過一篇《如何設計一個C++的類》,今天這里繼續聊聊如何設計結構體,注意本文不介紹在C++中結構體和類具體有什么區別,本文所說的結構體是指只有數據字段不帶任何函數的那種結構體。

當創建結構體的實例時,結構體的數據成員會按其聲明的順序連續存儲。然而,這個聲明的順序也是有學問的,順序不同結構體的大小可能有很大差別,數據成員的訪問性能也可能會有很大區別!

這里涉及一個概念:內存對齊。關于內存對齊我之前寫過一篇文章:《內存對齊》,這里不深入討論,只是簡單介紹一下。

大多數編譯器會對齊數據成員,會以四舍五入地址方式來優化數據的訪問,如下表所示。

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

這種內存對齊可能會在成員大小混合的結構體中產生未使用字節的空洞。

例如:

struct S {

short int a; // 2字節

// 6個空洞

double b; // 8

int d; // 4

// 4個空洞

};

S ArrayOfStructures[100];

這里,在a和b之間有6個未使用的字節,因為b必須從一個能被8整除的地址開始。

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

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

struct S {

double b; // 8

int d; // 4

short int a; // 2

// 2個空洞

};

S ArrayOfStructures[100];

這種重新排序使結構體變小了8個字節,那整個數組則變小了800個字節。

在此特性上,類和結構體相同。通過重新排序數據成員,結構體對象和類對象通常可以變得更小。如果類至少有一個虛成員函數,則在第一個數據成員之前或最后一個成員之后會有一個指向虛函數表的指針。該指針在32位系統中為4字節,在64位系統中為8字節。

如果不確定結構體或它的每個成員有多大,可以使用sizeof操作符進行一些測試。sizeof操作符返回的值包括對象末尾的任何未使用的字節(內存對齊后的字節數)。

還有一個知識點:

如果數據成員相對于結構體或類開頭的偏移量小于128,則訪問數據成員的代碼會更加緊湊,因為該偏移量可以使用8位有符號的數字來表示。如果相對于結構體或類的開頭的偏移量是128字節或更多,那么偏移量必須表示為一個32位數字(指令集在8位到32位之間沒有偏移量)。例如:

struct S {

int a[100]; // 400

int b; // 4

int read() { return b; }

};

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

這會使代碼更緊湊,方便更有效地使用代碼緩存。因此,建議在結構或類聲明中,大數組和其他大對象排在最后,最常用的數據成員排在前面。如果不能在前128個字節內包含所有數據成員,則將最常用的成員放在前128個字節中。

通過上面兩個小知識點可以使得將結構體設計的更小,訪問數據成員的速度更快,但是這有時往往會犧牲一些可讀性,比如這種結構體:

struct S {

int deskA;

double deskB;

bool deskC;

int chairA;

double chairB;

bool chairC;

};

可能這樣修改后結構體會更小:

struct S {

int deskA;

int chairA;

double deskB;

double chairB;

bool deskC;

bool chairC;

};

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

小總結:

注意內存對齊;

128是個檻,常用的數據成員可考慮放在前128字節中,不常用的或大的數據成員可考慮放在后面;

注重性能優化的同時也需要權衡一下代碼的可讀性。

打完收工。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    38

    文章

    7653

    瀏覽量

    167414
  • 內存
    +關注

    關注

    8

    文章

    3125

    瀏覽量

    75271
  • 結構體
    +關注

    關注

    1

    文章

    131

    瀏覽量

    11115

原文標題:如何設計結構體

文章出處:【微信號:gh_3980db2283cd,微信公眾號:開關電源芯片】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    定義IO初始化結構

    由上述IOPORT相關功能的枚舉類型我們可以知道,在對IOPORT模塊進行初始化時需要根據情況配置它們。因此我們定義一個IOPORT初始化的結構類型IOPORT_Init_t,它的成員包括了由上述所有枚舉類型所聲明的變量,因此該結構
    的頭像 發表于 07-16 16:26 ?541次閱讀

    滲壓計在混凝土結構中的安裝指南

    在現代土木工程和巖土工程中,滲壓計是監測混凝土結構體內孔隙水壓力變化的重要工具。南京峟思公司生產的滲壓計因其高精度和可靠性而被廣泛應用于各種工程監測項目中。一、滲壓計在混凝土結構中的應用價值滲壓計
    的頭像 發表于 05-28 10:55 ?158次閱讀
    滲壓計在混凝土<b class='flag-5'>結構</b><b class='flag-5'>體</b>中的安裝指南

    使用USB控制中心通過FX3將數據傳輸到DSP,數據字丟失怎么解決?

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

    程序設計與數據結構

    《程序設計與數據結構》重點闡述了三大方向內容: 1. C語言學習中的痛點:針對當前工程師在C語言學習中的痛點,如指針函數與函數指針,如何靈活應用結構等。從變量的三要素(變量的類型,變量的值和變量
    發表于 05-13 16:45

    C語言中結構與聯合體的深度解析:內存布局與應用場景

    一、基礎概念與核心差異 1.1 結構(Struct)的本質 **結構是C語言中實現數據封裝的基石,其核心特征在于內存獨立性。每個成員變量
    發表于 04-08 09:18

    ADS1293在中斷采用Stream mode讀取數據數據字節數不對是哪里出了問題?

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

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

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

    ADS5547, DAC8822時序圖上只有數據在寄存器之間轉換的時序,難道更新速率只和數據在寄存器之間轉換時間有關嗎?

    ADS5547, DAC8822時序圖上只有數據在寄存器之間轉換的時序,難道更新速率只和數據在寄存器之間轉換時間有關嗎?
    發表于 12-20 07:28

    ADS7953SDBTR上電時16個通道中,只有4個通道有數據,其余12個通道無數據,怎么解決?

    請教一下,我現在有用一個16通道的模數轉換器ADS7953SDBTR,使用過程中出現了一個問題,第一次上電的時候只有4個通道有數據,其它12個通道沒有數據,然后掉電重啟,16個通道都正常了,檢測了
    發表于 12-06 07:26

    結構成員的順序會影響結構的大小嗎

    相同的結構成員,如果把順序調整一下,會不會影響結構的大小? 答案是會的,這主要跟字節對齊有關。 比如這樣的結構
    的頭像 發表于 11-25 16:24 ?563次閱讀

    AD7686芯片不傳輸數據給STM32,但是手按住就會有數據

    AD7686芯片不傳輸數據給STM32,但是手按住就會有數據
    發表于 11-16 21:12

    AFE4403在采集血氧數據時不夠平滑,會有數據波動,為什么?

    在采集血氧數據時不夠平滑,會有數據波動
    發表于 11-15 07:46

    C語言和C++中結構的區別

    同樣是結構,看看在C語言和C++中有什么區別?
    的頭像 發表于 10-30 15:11 ?771次閱讀

    PCM1865-Q1在LRCK低電平時只有DOUT2有數據,DOUT沒有數據,為什么?

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

    TLV320aic3101的TDM設置,想用TDM采集所有數據,請問怎樣設置?

    請教TLV320aic3101的TDM設置,現在我接了兩路聲音,一共4聲道到一片TLV320aic3101,想用TDM采集所有數據,請問怎樣設置?現在我已經打開了256-clock,發現只有其中
    發表于 10-24 07:34