Re: [問題] struct alignment

看板C_and_CPP (C/C++)作者 (BaJiaJhon)時間5年前 (2019/12/19 04:05), 5年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串4/4 (看更多)
既然是C、又是MCU,直接對齊後, 用指標位移去存取應該是比較合理的 解法。 效能跟花費空間應該足夠小了。但犧 牲的就是可讀性,跟擴充性,也不適 合暴露在太多地方,小範圍使用還是 OK的。 如果位移不一樣,而且有其他地方可 以知道物件種類的話,可以建立位移 表來查詢該結構的位移。 另外不同編譯器,對齊的方式以及 attribute可能會不同。手邊剛好沒有 硬體可以測試,在windows上結果是 OK的,編譯器是MinGW-W64。 希望能釣出更多高手來回文。 gist 好讀版 https://reurl.cc/D1pZRO #include <inttypes.h> #include <stdio.h> typedef struct __attribute__((packed, aligned(1))) _A { uint8_t num; uint16_t a; } A_t; typedef struct __attribute__((packed, aligned(1))) _B { uint8_t num; uint32_t b; } B_t; void num_plus_plus(void *p){ *((uint8_t*)(p + 0)) += 1; } int main(int argc, char const *argv[]) { A_t a = { .num = 0, .a = 0 }; B_t b = { .num = 3, .b = 1 }; printf("a.num = %d, b.num = %d\n", a.num, b.num); num_plus_plus(&a); printf("a.num = %d, b.num = %d\n", a.num, b.num); num_plus_plus(&b); printf("a.num = %d, b.num = %d\n", a.num, b.num); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.231.155.188 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1576699511.A.C94.html ※ 編輯: BaJiaJhon (49.216.43.113 臺灣), 12/19/2019 04:08:54
文章代碼(AID): #1T-ePtoK (C_and_CPP)
文章代碼(AID): #1T-ePtoK (C_and_CPP)