baiyansegmentfault
所有視頻:https://segmentfault.com/a/11...數組
源視頻地址:http://replay.xesv5.com/ll/24...架構
接下來觀察mm_heap中的字段:函數
跟進main_chunk字段:性能
- next、prev字段表明chunk與chunk之間以雙向鏈表連接,當只有一個chunk結點時,next和prev指針均指向本身 - free_pages字段爲511,說明512個page中,有1個page被使用了,剩餘511個空閒page - free_map字段爲8個uint64_t類型,標記每一個page是否被使用,共512bit。每一個chunk中的512個page被分紅了8組,每組64個page,正好對應free_map中的每一項,0是未使用,1是已使用 - map字段爲512個uint32_t類型,共2KB。來標記是small內存仍是large內存,並能夠利用低位存儲bit_num或已用的page數量等信息。這裏它是一個large內存,有1個page已經被使用(存mm_heap)
#include <stdio.h> #define _BIN_DATA_SIZE(num, size, elements, pages, x, y) size, #define ZEND_MM_BINS_INFO(_, x, y) \ _( 0, 8, 512, 1, x, y) \ _( 1, 16, 256, 1, x, y) \ _( 2, 24, 170, 1, x, y) \ _( 3, 32, 128, 1, x, y) \ _( 4, 40, 102, 1, x, y) \ _( 5, 48, 85, 1, x, y) \ _( 6, 56, 73, 1, x, y) \ _( 7, 64, 64, 1, x, y) \ _( 8, 80, 51, 1, x, y) \ _( 9, 96, 42, 1, x, y) \ _(10, 112, 36, 1, x, y) \ _(11, 128, 32, 1, x, y) \ _(12, 160, 25, 1, x, y) \ _(13, 192, 21, 1, x, y) \ _(14, 224, 18, 1, x, y) \ _(15, 256, 16, 1, x, y) \ _(16, 320, 64, 5, x, y) \ _(17, 384, 32, 3, x, y) \ _(18, 448, 9, 1, x, y) \ _(19, 512, 8, 1, x, y) \ _(20, 640, 32, 5, x, y) \ _(21, 768, 16, 3, x, y) \ _(22, 896, 9, 2, x, y) \ _(23, 1024, 8, 2, x, y) \ _(24, 1280, 16, 5, x, y) \ _(25, 1536, 8, 3, x, y) \ _(26, 1792, 16, 7, x, y) \ _(27, 2048, 8, 4, x, y) \ _(28, 2560, 8, 5, x, y) \ _(29, 3072, 4, 3, x, y) int main() { int bin_data_size[] = { ZEND_MM_BINS_INFO(_BIN_DATA_SIZE, x, y) }; for (int i = 0; i < sizeof(bin_data_size) / sizeof(bin_data_size[0]); i++) { printf("%d, ", bin_data_size[i]); } //打印結果爲: //{8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 640, 768, 896, 1024, 1280, 1536, 1792, 2048, 2560, 3072} }
這樣看確實很難看出來,在這個基礎上,我作了一個簡化版本:ui
#include <stdio.h> #define _BIN_DATA_SIZE(num, size, elements, pages, x, y) size, #define ZEND_MM_BINS_INFO(_, x, y) _( 0, 8, 512, 1, x, y) int main() { int data[] = { ZEND_MM_BINS_INFO(_BIN_DATA_SIZE, x, y) }; for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++) { printf("%d, ", data[i]); } //打印結果爲: //{8, } }
#define _BIN_DATA_SIZE(num, size, elements, pages, x, y) size, static const uint32_t bin_data_size[] = { ZEND_MM_BINS_INFO(_BIN_DATA_SIZE, x, y) }; #define _BIN_DATA_ELEMENTS(num, size, elements, pages, x, y) elements, static const uint32_t bin_elements[] = { ZEND_MM_BINS_INFO(_BIN_DATA_ELEMENTS, x, y) }; #define _BIN_DATA_PAGES(num, size, elements, pages, x, y) pages, static const uint32_t bin_pages[] = { ZEND_MM_BINS_INFO(_BIN_DATA_PAGES, x, y) };