Sunday, January 28, 2018

Structure Padding in C/C++

這篇會簡單提到 C/C++ 裡面的struct padding.

前幾天面試有遇到相關問題, 沒有研究過 compiler 當場回答不出來

之後在網路上查了相關資料並且用clion測試後整理出結論:

structure 是 C/C++ 用來把不同data type 打包起來

struct car {
  int serial_number;
  long long year;
  char type;
  char name[8];
} car_t;

問題 1:  sizeof(car_t) 有多大呢?

這種問題,是半開放的問題

需要做很多假設

1. 第一件事一定要考慮 32/ 64 bit machines.
這個或許會影響 pointer size 的不同. 為什麼我說也許, 因為platform 也會影響 pointer size.

2. 第二件事是compiler,有些comiler 可以optimize. 我不太懂就不多贅述了

考慮完之後我們可以計算


  int serial_number; -> 32 bits -> 4 bytes
  long long year; -> 64 bits -> 8 bytes
  char type; -> 8 bits -> 1 byte;
  char name[8]; ->  8 * 8 bits -> 8 bytes

得到 4 + 8 + 1 + 8 = 21 bytes.

這並不是正確答案

在底層實作上會加上padding.

通常會找出struct 中最大的 bytes. 然後一個一個往下放進去

以上述例子

最大的element 是 8 bytes. 放不下的時候要補足8 bytes 再往下做

int serial_number; -> 4 bytes
#### padding 4 bytes
long long year; -> 8 bytes
#### padding 0 bytes
char type; -> 1 byte  +   char name[:7] -> 7 bytes
#### padding 0 bytes
char name[8:]; -> 1 byte
#### padding  7 bytes

最後總共會是32 bytes.

依照上述的規則如果我們把順序調整

struct car {
  int serial_number;
  char type; // change the order
  long long year;
  char name[8];
} car_t;

int serial_number; -> 4 bytes
char type; -> 1 byte
#### padding 3 bytes
long long year; -> 8 bytes
#### padding 0 bytes
char name[8]; -> 8 byte
#### padding 0 bytes

總共會用到 24 bytes

在底層C/C++ structure 非常常用

如果可以減少 size 也許會對performance有很大影響


https://www.ibm.com/developerworks/library/l-port64/index.html
https://www.geeksforgeeks.org/structure-member-alignment-padding-and-data-packing/







最後一次實習

這個暑假在灣區做軟體工程師實習。 由於先前的兩個軟體實習以及大學研究所所學符合, 幸運地獲得 kernel, platform 相關的實習機會。 經過了三個實習 愛荷華州 8 個月 竹科 2 個月 灣區 3 個月 沒...