{"id":483057,"date":"2026-06-09T21:25:34","date_gmt":"2026-06-09T21:25:34","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=483057"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=483057","title":{"rendered":"OSDEV: \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430 \u043d\u0430 \u0421++ \u0447\u0430\u0441\u0442\u044c 3. \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/860872\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 1<\/a><\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/861930\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 2<\/a><\/p>\n<p>\u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 <a href=\"https:\/\/github.com\/GNUDimarik\/small_allocator\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u043c<\/a> \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/p>\n<p>\u0412 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0439\u0434\u0435\u0442 \u0440\u0435\u0447\u044c \u0443\u0436\u0435 \u043e \u0433\u043e\u0442\u043e\u0432\u043e\u043c \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438. \u041e\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d, \u043d\u043e \u0438\u0434\u0435\u044f \u0442\u0430 \u0436\u0435 \u0441\u0430\u043c\u0430\u044f, \u043d\u0435\u044f\u0432\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u0441 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u043c\u0438 \u0442\u0435\u0433\u0430\u043c\u0438 \u0441\u0432\u0435\u0440\u0445\u0443 \u0438 \u0441\u043d\u0438\u0437\u0443, \u043d\u043e \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432. \u0422.\u0435. \u043f\u043e \u0441\u0443\u0442\u0438 \u0441 \u0431\u0438\u043d\u0430\u043c\u0438.<\/p>\n<p>\u0411\u0438\u043d\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 256 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438. \u0411\u043b\u043e\u043a\u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0431\u0438\u043d\u0435 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0430\u0432\u0435\u043d \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u0431\u043b\u043e\u043a\u0430 \u0435\u0441\u043b\u0438 \u0431\u043b\u043e\u043a &lt;= 255 \u0431\u0430\u0439\u0442, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u043b\u0435\u0436\u0430\u0442 \u0432 \u0431\u0438\u043d\u0435 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c 255 \u0438 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443. \u0412 \u0431\u0438\u043d\u0430\u0445 \u0441 \u043c\u0435\u043d\u044c\u0448\u0438\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e O(1). \u0422\u0430\u043a \u0436\u0435 \u043f\u043e\u0438\u0441\u043a \u0431\u0438\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u044b\u043c \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0442\u0430\u043a \u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(1), \u044d\u0442\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430. \u0414\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0432 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u0441\u043f\u0438\u0441\u043a\u0435.<\/p>\n<p>\u0412\u043e\u0442 \u043e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e3f\/797\/8be\/e3f7978be625dfcf78fc08c37c3240e2.png\" width=\"1536\" height=\"1024\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e3f\/797\/8be\/e3f7978be625dfcf78fc08c37c3240e2.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e3f\/797\/8be\/e3f7978be625dfcf78fc08c37c3240e2.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0418\u043d\u0434\u0435\u043a\u0441 \u0431\u0438\u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">static size_t bin_index_from_size(size_t size){    if (size &gt;= kHugeBlockMinSize) {        return kHugeBinIndex;    }    return size;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0432\u044f\u0437\u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u043c payload, \u0442.\u0435. \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0435\u0441\u043b\u0438 \u0431\u043b\u043e\u043a \u0437\u0430\u043d\u044f\u0442, \u043d\u043e \u0435\u0441\u043b\u0438 \u0431\u043b\u043e\u043a \u0441\u0432\u043e\u0431\u043e\u0434\u0435\u043d, \u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u0437\u0430\u0445\u043e\u0442\u0438\u043c. \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0431\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0441 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 16 \u0431\u0430\u0439\u0442, \u0438\u043b\u0438 sizeof(void*) * 2<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/478\/0da\/a5c\/4780daa5c569f32eeedaaea8ad99c09e.png\" width=\"1536\" height=\"1024\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/478\/0da\/a5c\/4780daa5c569f32eeedaaea8ad99c09e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/478\/0da\/a5c\/4780daa5c569f32eeedaaea8ad99c09e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u042d\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 \u0441\u0442\u0438\u043b\u0435 \u0421. <strong>\u0412\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u043d\u0430 payload \u0431\u043b\u043e\u043a\u0430. <\/strong>\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u0431\u043b\u043e\u043a\u0430\u043c\u0438, \u0430 \u043d\u0435 \u0441 \u0441\u044b\u0440\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e. \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e!<\/p>\n<p>\u041d\u0438\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u0441 \u0441\u044b\u0440\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e. \u0418\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u0438\u0437 \u043d\u0435\u0435 \u0431\u043b\u043e\u043a\u0438.<\/p>\n<pre><code class=\"cpp\">\/** * Memory block related stuff *\/\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0442\u0438\u043f\u0430 size_t* \u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0443\u043a\u0437\u044b\u0432\u0430\u0435\u0442 __p\/\/ \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0439\u0441\u044f \u0432 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u0442\u0435\u0433\u0430\u0445static size_t *mem_block_size_t_ptr(void *_p){    return reinterpret_cast&lt;size_t *&gt;(_p);}\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0447\u0442\u043e __p \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0445\u0435\u0434\u0435\u0440\/\/ \u0438\u043b\u0438 \u0444\u0443\u0442\u0435\u0440 \u0431\u043b\u043e\u043a\u0430static size_t mem_block_get_size(void *_p){    return *mem_block_size_t_ptr(_p) &amp; ~0x01;}\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0442\u0438\u043f\u0430 char* \u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0443\u043a\u0437\u044b\u0432\u0430\u0435\u0442 __p\/\/ \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438, \u0447\u0442\u043e \u0431\u044b \u0448\u0430\u0433 \u0431\u044b\u043b \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432 \u0431\u0430\u0439\u0442static char *mem_block_char_ptr(void *_p){    return reinterpret_cast&lt;char *&gt;(_p);}\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payload \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0431\u043b\u043e\u043a\u0430\/\/ \u0412\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u043d\u0430 payloadstatic char *mem_block_user_ptr(void *_p){    return mem_block_char_ptr(_p) + kHeaderSize;}\/\/ \u0423\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u0438 \u0431\u0438\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u0421\u043e\u0431\u043e\u0434\u0435\u043d\\\u0437\u0430\u043d\u044f\u0442static void mem_block_pack(void *_p, size_t _sz, size_t _st){    *mem_block_size_t_ptr(_p) = _sz | _st;}\/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0431\u043b\u043e\u043a\u0430 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 payloadstatic char *mem_block_header(void *_p){    return mem_block_char_ptr(_p) - kHeaderSize;}\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 payloadstatic size_t mem_block_size(void *_p){    return mem_block_get_size(mem_block_header(_p));}\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u044d\u043f\u0438\u043b\u043e\u0433 \u0431\u043b\u043e\u043a\u0430 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 payloadstatic char *mem_block_footer(void *_p){    return mem_block_char_ptr(_p) + mem_block_size(_p);}\/\/ \u0427\u0438\u0442\u0430\u0435\u0442 \u0437\u0430\u043d\u044f\u0442 \u043b\u0438 \u0431\u043b\u043e\u043a \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u0442\u0435\u0433\u043e\u0432static size_t mem_block_get_alloc(void *p){    return (*mem_block_size_t_ptr(p) &amp; 0x01);}\/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043d \u043b\u0438 \u0431\u043b\u043e\u043a \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 payloadstatic bool mem_block_is_allocated(void *p){    return mem_block_get_alloc(mem_block_header(p)) == kBlockAllocated;}static bool mem_block_is_free(void *p){    return !mem_block_is_allocated(p);}\/\/ \u041a\u043b\u0430\u0434\u0435\u0442 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0431\u043b\u043e\u043a\u0430. __p \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payloadstatic void mem_block_put_to_header(void *_p, size_t _sz, size_t state){    mem_block_pack(mem_block_header(_p), _sz, state);}\/\/ \u041a\u043b\u0430\u0434\u0435\u0442 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 \u0444\u0443\u0442\u0435\u0440 \u0431\u043b\u043e\u043a\u0430. __p \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payloadstatic void mem_block_put_to_footer(void *_p, size_t _sz, size_t state){    mem_block_pack(mem_block_footer(_p), _sz, state);}\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u043b\u043e\u043a \u0438\u0437 \u043d\u0435\u044f\u0432\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430. \u0422.\u0435. \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043c\u0435\u0436\u043d\u044b\u0439 \u0431\u043b\u043e\u043a\/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payload. __p \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payloadstatic void *mem_block_next(void *_p){    return mem_block_char_ptr(_p) + mem_block_size(_p) + kOverheadSize;}\/\/ \u0422\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u0430. __p \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payload\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payloadstatic inline void *mem_block_init_block(void *_p, size_t _sz,                                         size_t state){\/\/ \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0445\u0435\u0434\u0435\u0440    mem_block_put_to_header(_p, _sz, state);\/\/ \u043f\u043e\u0442\u043e\u043c \u0444\u0443\u0442\u0435\u0440    mem_block_put_to_footer(_p, _sz, state);    return _p;}\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0431\u043b\u043e\u043a \u0438\u0437 \u043d\u0435\u044f\u0432\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430. \u0422.\u0435. \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0441\u043c\u0435\u0436\u043d\u044b\u0439 \u0431\u043b\u043e\u043a\/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payload\/\/ __p \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payloadstatic void *mem_block_prev(void *_p){    char *header = mem_block_char_ptr(mem_block_header(_p));    char *prev_footer = header - kFooterSize;    size_t prev_size = mem_block_get_size(prev_footer);    return prev_footer - prev_size;}\/\/ \u0420\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u0441 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u043e\u043c, \u0442.\u0435. \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u0444\u0443\u0442\u0435\u0440\u0430\/\/ ptr \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payloadstatic inline size_t mem_block_size_with_overhead(void *ptr){    return mem_block_size(ptr) + kOverheadSize;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0441\u0435\u0431\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435. \u041e\u043d \u043a\u043b\u0430\u0434\u0435\u0442 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0432 \u0431\u0438\u043d \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c 255.<\/p>\n<pre><code class=\"cpp\">int mem_initialize(void *base, size_t size){    if (base &amp;&amp; size &gt; 0 &amp;&amp; (size % 2 == 0)) {        size_t binsSize = kBinCount * sizeof(void *);        if (size &gt; binsSize) {            gMemStart = mem_block_char_ptr(base);\/\/ \u0415\u0441\u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u044d\u0442\u043e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441 \u0442\u043e \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0443\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0435 sizeof(void*) * 256 \/\/ \u0431\u0430\u0439\u0442 \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0431\u0438\u043d\u043e\u0432 \u0438\u043d\u0430\u0447\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0442\u0435\u043a\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432         #if BINS_ARE_IN_HEAP            gMemStart = mem_block_char_ptr(base) + binsSize;            size -= binsSize;            gBinList = reinterpret_cast&lt;ListHead **&gt;(base);            ALOGD(\"gBinList %p binsSize %zu gMemStart %p\", gBinList, binsSize, gMemStart);#endif\/\/ \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0431\u0438\u043d\u044b \u0432 nullptr            memset(gBinList, 0, binsSize);\/\/ \u041f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u043b\u043e\u043a\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u043c\u0438 \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u044b\/\/ \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0441\u043b\u0438\u044f\u043d\u0438\u044f            mem_block_pack(gMemStart, kOverheadSize, kBlockAllocated);            mem_block_pack(gMemStart + kHeaderSize + kOverheadSize,                           kOverheadSize, kBlockAllocated);\/\/ \u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0443\u0447\u0438 \u043d\u0430 \u043d\u0430\/\/ 5 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u043e\u0432 \u044d\u0442\u043e \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u044b \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435        \/\/ \u0438 \u0438\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0440\u0430\u0432\u043d\u044b\u0435 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u0443 \u0431\u043b\u043e\u043a\u0430 \u0438 \u043f\u044f\u0442\u044b\u0439 \u044d\u0442\u043e \u043e\u0432\u0435\u0440\u0445\u0435\u0434 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e\/\/ \u0431\u043b\u043e\u043a\u0430            size_t heapSize = size - (kOverheadSize * 5);            void *heap = mem_block_next(mem_block_user_ptr(gMemStart));            mem_block_init_block(heap, heapSize, kBlockFree);\/\/ \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u043b\u043e\u043a \u0442\u0430\u043a \u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u043c \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043d            gMemEnd = mem_block_char_ptr(mem_block_next(heap)) - kHeaderSize;            mem_block_pack(gMemEnd, kOverheadSize, kBlockAllocated);            mem_block_pack(gMemEnd + kOverheadSize + kHeaderSize, kOverheadSize, kBlockAllocated);            auto firstBlock = mem_block_list_head(heap);\/\/ \u041f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u043a\u043b\u0430\u0434\u0435\u043c \u0432 \u0431\u0438\u043d \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0431\u043b\u043e\u043a            bin_insert(firstBlock);            return 0;        }    }    else {        ALOGE(\"Could not initialize memory with params base %p size %zu\", base, size);    }    ALOGD(\"gMemStart %p gMemEnd %p size %td\",          gMemStart,          gMemEnd,          mem_block_char_ptr(gMemEnd) - mem_block_char_ptr(gMemStart));    return EINVAL;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043a \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0438 \u043f\u043e\u0442\u0438\u0445\u043e\u043d\u044c\u043a\u0443 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0431\u0438\u043d\u0430\u043c.<\/p>\n<pre><code class=\"cpp\">void *mem_malloc(size_t size){    void *block = nullptr;    if (gMemStart) {        if (size &gt; 0) {            \/\/ \u0412\u0435\u0440\u043d\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 sizeof(void*) * 2 \u0431\u0435\u0437 \u0443\u0447\u0435\u0442\u0430            \/\/ \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u0430. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0443\u0447\u0442\u0435\u043d \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 mem_block_place            size_t aligned_size = mem_block_aligned_size(size);            \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0431\u0438\u043d\u044b, \u0435\u0441\u043b\u0438 \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0435\u0433\u043e            auto memoryBlock = bin_find_free_block(aligned_size);            if (memoryBlock) {                block = memoryBlock;                \/\/ \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0438\u0437 \u0431\u0438\u043d\u0430                bin_erase(block);                \/\/ \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0431\u043b\u043e\u043a \u043e\u0442\u0440\u0435\u0437\u0430\u044f \u043e\u0442 \u043d\u0435\u0433\u043e \u043a\u0443\u0441\u043e\u043a \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e                block = mem_block_place(block, aligned_size);                \/\/ \u0415\u0441\u043b\u0438 \u043c\u044b \u043e\u0442\u0440\u0435\u0436\u0435\u043c \u043e\u0442 \u0431\u043b\u043e\u043a\u0430 \u043a\u0443\u0441\u043e\u043a, \u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0441 \u043d\u0430\u0447\u0430\u043b\u0430. \u0422\u043e\u0433\u0434\u0430                \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0431\u043b\u043e\u043a \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438 \u043c\u044b \u0432\u0437\u044f\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0433\u043e \u0447\u0430\u0441\u0442\u044c                \/\/ \u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043c\u0435\u0436\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u0435\u043d                auto next = mem_block_next(block);                if (next &lt; gMemEnd &amp;&amp; next &gt; gMemStart &amp;&amp; mem_block_is_free(next)) {                    auto nextBlock = mem_block_list_head(next);                \/\/ \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0442\u0430\u043a \u0442\u043e \u043a\u043b\u0430\u0434\u0435\u043c \u0435\u0433\u043e \u0432 \u0431\u0438\u043d                    bin_insert(nextBlock);                }            }        }        else {            ALOGE(\"Could not allocate block with size %zu\", size);            errno = EINVAL;        }    }    else {        errno = EINVAL;        ALOGE(\"Not initialized\");    }    return block;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 mem_malloc \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438:<\/p>\n<p>mem_block_place, bin_find_free_block \u0438 bin_insert<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 mem_block_place \u043e\u043d\u0430 \u0441\u0430\u043c\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u0445\u043e\u0442\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0439.<\/p>\n<pre><code class=\"cpp\">static void *mem_block_place(void *block, size_t sz){\/\/ \u0432\u044b\u044f\u0441\u043d\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430. \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e \u043e\u043d \u0441\u0432\u043e\u0434\u043e\u0435\u043d \u0440\u0430\u0437 \u043c\u044b \u0442\u0443\u0442    size_t cur_size = mem_block_size(block);\/\/ \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043e\u0442 \u0431\u043b\u043e\u043a\u0430 \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c\/\/ \u043e\u0442\u0440\u0435\u0437\u0430\u0442\u044c \u043e\u0442 \u043d\u0435\u0433\u043e sz \u0431\u0430\u0439\u0442    size_t remain = cur_size - sz;\/\/ \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430, \u0442.\u0435. 2 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e payload \u0431\u043b\u043e\u043a\u0430\/\/ \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0432\u0435\u0440\u0445\u0435\u0434 + \u0435\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\/\/ \u0438 \u0442\u043e\u0433\u043e sizeof(void*) * 4\/\/ \u0442\u043e \u043e\u0442\u0440\u0435\u0437\u0430\u0435\u043c \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u043b\u043e\u043a\u0430 sz \u0431\u0430\u0439\u0442 \u043c\u0435\u043d\u044f\u044f \u0438\u043c\u0435\u044e\u0449\u0438\u0439\u0441\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a    if (remain &gt;= kOverheadSize * 2) {\/\/ \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044f \u0432 \u0440\u0430\u0441\u0447\u0435\u0442 \u0447\u0442\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u0444\u0443\u0442\u0435\u0440 \u0438 \u043d\u043e\u0432\u044b\u0439 \u0445\u0435\u0434\u0435\u0440\/\/ \u0444\u0443\u0442\u0435\u0440 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0438 \u0445\u0435\u0434\u0435\u0440 \u0434\u043b\u044f \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u043a\u0443\u0441\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438        remain -= kOverheadSize;              \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0431\u043b\u043e\u043a        mem_block_put_to_header(block, sz, kBlockAllocated);        mem_block_put_to_footer(block, sz, kBlockAllocated);        \/\/ \u0433\u043e\u0442\u043e\u0432\u043e        \/\/ \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u0432\u0435\u0440\u0445\u0435\u0434 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u043d\u043e\u0432\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0438 \u0443\u0445\u043e\u0434\u0438\u043c        auto next = mem_block_next(block);        mem_block_put_to_header(next, remain, kBlockFree);        mem_block_put_to_footer(next, remain, kBlockFree);        return block;    }\/\/ \u0435\u0441\u043b\u0438 remain \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c sizeof(void*) * 4 \u0434\u0430\u0436\u0435 \u043d\u0430 1 \u0431\u0430\u0439\u0442\/\/ \u043c\u044b \u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0433\u0430\u0435\u043c \u044d\u0442\u0438\u043c \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0432\u0435\u0441\u044c \u0431\u043b\u043e\u043a    mem_block_put_to_header(block, cur_size, kBlockAllocated);    mem_block_put_to_footer(block, cur_size, kBlockAllocated);    return block;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 aligned_size \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0432\u0435\u0440\u0445\u0435\u0434 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c \u0447\u0442\u043e \u0441\u0430\u043c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0443\u0436\u0435 \u0435\u0433\u043e \u0438\u043c\u0435\u0435\u0442 \u0438 \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 mem_block_place \u043c\u044b \u043b\u0438\u0431\u043e \u043e\u0442\u0440\u0435\u0437\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0447\u0442\u043e \u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043e\u0432\u0435\u0440\u0445\u0435\u0434 \u043b\u0438\u0431\u043e \u043e\u0442\u0434\u0430\u0435\u043c \u0438\u043c\u0435\u044e\u0449\u0438\u0439\u0441\u044f \u0431\u043b\u043e\u043a \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0430<\/p>\n<p>(sizeof(void*) * 4) &#8212; 1, \u0442.\u0435. \u043d\u0430 63 \u0431\u0430\u0439\u0442\u0430<\/p>\n<p>\u0421\u0430\u043c\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432 \u043a\u043e\u0434\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b:<\/p>\n<pre><code class=\"cpp\">struct ListHead{    ListHead *next = nullptr;    ListHead *prev = nullptr;};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043c\u0435\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0437 \u0431\u043b\u043e\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 ListHead*<\/p>\n<pre><code class=\"cpp\">static inline ListHead *mem_block_list_head(void *ptr){    auto head = reinterpret_cast&lt;ListHead *&gt;(ptr);    head-&gt;next = nullptr;    head-&gt;prev = nullptr;    return head;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u043a \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u043d\u0435\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e \u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0435 \u0441 \u0441\u044b\u0440\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e, \u0430 \u0441 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payload. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u0432 payload \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0434\u0432\u0435 \u043d\u043e\u0434\u044b \u0441\u043f\u0438\u0441\u043a\u0430. \u042f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0447\u0442\u043e \u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0437\u0430 O(1).<\/p>\n<pre><code class=\"cpp\">static ListHead *list_erase(ListHead *head){    auto prev = head-&gt;prev;    auto next = head-&gt;next;    if (prev) {        prev-&gt;next = next;    }    if (next) {        next-&gt;prev = prev;    }    head-&gt;next = nullptr;    head-&gt;prev = nullptr;    return next;}static void bin_erase(void *block){    auto *head = reinterpret_cast&lt;ListHead *&gt;(block);    size_t index = bin_index_from_size(mem_block_size(block));    list_erase(head);    if (gBinList[index] == head) {        gBinList[index] = head-&gt;next;    }    head-&gt;next = nullptr;    head-&gt;prev = nullptr;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u0438 \u0431\u043b\u043e\u043a\u043e\u0432. \u041d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435. \u0421\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0438\u0441\u043a \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430:<\/p>\n<pre><code class=\"cpp\">static ListHead *bin_find(size_t index, size_t size){    auto block = gBinList[index];    while (block) {        if (mem_block_size(block) &gt;= size) {            break;        }        block = block-&gt;next;    }    return block;}static ListHead *bin_find_free_block(size_t size){\/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0431\u0438\u043d\u0430 \u0438\u0437 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0431\u043b\u043e\u043a\u0430    size_t index = bin_index_from_size(size);\/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0431\u0438\u043d \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0437\u0430 O(1)    auto block = gBinList[index];\/\/ \u0414\u0430\u043b\u0435\u0435    if (block) {        if (index == kHugeBinIndex) {\/\/ \u0435\u0441\u043b\u0438 \u0431\u043b\u043e\u043a \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u0449\u0435\u043c \u0432 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0431\u0438\u043d\u0435\/\/ \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c O(n) \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043c\u044b \u0438\u0449\u0435\u043c \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u043b\u043e\u043a\/\/ \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0432 \u0441\u043f\u0438\u0441\u043a\u0435            block = bin_find(index, size);        }    }    else {\/\/ \u0438\u043d\u0430\u0447\u0435 \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f. \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e \u0447\u0442\u043e \u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0431\u0438\u043d\u0430\u0445\/\/ \u043b\u0435\u0436\u0430\u0442 \u0431\u043b\u043e\u043a\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439\/\/ \u043f\u043e\u043f\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u0441 \u043d\u0443\u0436\u043d\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c\/\/ \u043d\u0430\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f, \u043d\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0433\u043e 256\/\/ \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u043f\u0435\u0440\u0432\u044b\u0439 \u0436\u0435 \u0431\u0438\u043d \u043a\u043e\u0442\u043e\u0440\u044b\u0439 != nullptr \u0434\u0430\u0441\u0442 \u043d\u0430\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\/\/ O(1)        for (size_t i = index; i &lt;= kHugeBinIndex &amp;&amp; !block; ++i) {            block = bin_find(i, size);        }    }    return block;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0442\u0430\u0432\u043a\u0443 \u0432 \u0431\u0438\u043d<\/p>\n<pre><code class=\"cpp\">\/\/ \u0422\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u043f\u0438\u0441\u043a\u0430template&lt;typename _Node&gt;_Node *free_list_prepend(_Node *head,                         _Node *block){    block-&gt;next = nullptr;    if (!head) {        return block;    }    if (head != block) {        block-&gt;next = head;        head-&gt;prev = block;    }    return block;}\/\/ \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0432 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0431\u0435\u0437 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443\/\/ \u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u0435\u0439\u0441\u0430 \u0432 \u043a\u043e\u0434\u0435template&lt;typename _Node, typename _Cmp&gt;_Node *__free_list_insert_sorted(_Node *head,                                 _Node *block,                                 _Cmp cmp){    if (!head) {        head = block;        head-&gt;next = nullptr;        return head;    }    auto cursor = head;    if (cmp(block, cursor)) {        return free_list_prepend(cursor, head);    }    while (cursor-&gt;next &amp;&amp; !cmp(block, cursor-&gt;next)) {        cursor = cursor-&gt;next;    }    block-&gt;next = cursor-&gt;next;    cursor-&gt;next = block;    block-&gt;prev = cursor;    if (cursor-&gt;next) {        cursor-&gt;next-&gt;prev = block;    }    return head;}\/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u044b\u0448\u0435 \u0441 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u043c \u0432 \u0432\u0438\u0434\u0435 \u043b\u044f\u043c\u0431\u0434\u044btemplate&lt;typename _Node&gt;_Node *free_list_insert_sorted_by_size(_Node *head,                                       _Node *block){    block-&gt;next = nullptr;    if (!head) {        return block;    }    if (head != block) {        auto cmp = [](_Node *first, _Node *second)        { return mem_block_size(first) &lt;= mem_block_size(second); };        return __free_list_insert_sorted&lt;_Node, decltype(cmp)&gt;(head, block, cmp);    }    return block;}\/\/ \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u043a\u0430template&lt;typename _Node&gt;_Node *bin_insert(_Node *block){    size_t index = mem_block_size(block);    if (index &lt; kHugeBinIndex) {        gBinList[index] = free_list_prepend(gBinList[index], block);    }    else {        gBinList[kHugeBinIndex] = free_list_insert_sorted_by_size(gBinList[kHugeBinIndex], block);    }    return block;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044e \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0430\u043c \u0432\u0438\u0434\u0435\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0437\u0430 O(1) \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0440\u0430\u0434\u043e\u0441\u0442\u043d\u043e.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0438\u0437 \u0431\u0438\u043d\u043e\u0432 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044bstatic void *mem_block_erase_merge(void *block){    auto current = mem_block_prev(block);    if (mem_block_is_free(current)) {        bin_erase(current); \/* O(1) *\/    }    current = mem_block_next(block);    if (mem_block_is_free(current)) {        bin_erase(current); \/* O(1) *\/    }\/\/ \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e    return mem_block_merge(block);}\/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0430\u043c\u043e\u0440\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e O(1) \u0441\u043e \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c!void mem_free(void *ptr){    if (ptr != nullptr &amp;&amp; mem_block_is_allocated(ptr)) {      \/\/ \u0431\u0435\u0440\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0447\u0442\u043e \u0431\u044b \u043f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a \u0441\u043d\u043e\u0432\u0430      \/\/ \u043a\u0430\u043a \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439        size_t size = mem_block_size(ptr);        mem_block_init_block(ptr, size, kBlockFree);            \/\/ \u0433\u043e\u0442\u043e\u0432\u043e \u0441\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u043e \u0441\u043c\u0435\u0436\u043d\u044b\u043c\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u043c\u0438 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e      \/\/ \u0443\u0434\u0430\u043b\u0438\u0432 \u0438\u0445 \u0438\u0437 \u0431\u0438\u043d\u043e\u0432        ptr = mem_block_erase_merge(ptr);      \/\/ \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0431\u043b\u043e\u043a \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0431\u0438\u043d        bin_insert(mem_block_list_head(ptr));    }    else {        ALOGE(\"%s(): Invalid pointer (%p)\\n\", __func__, ptr);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043b\u0438\u044f\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">static void *mem_block_merge(void *ptr){\/\/ \u0431\u0435\u0440\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0438\u0439 \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438      auto next = mem_block_next(ptr);    auto prev = mem_block_prev(ptr);\/\/ \u0432\u044b\u044f\u0441\u043d\u044f\u0435\u043c \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043b\u0438 \u043e\u043d\u0438    bool next_allocated = mem_block_is_allocated(next);    bool prev_allocated = mem_block_is_allocated(prev);\/\/ \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430, \u043e\u043d \u0435\u0449\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f ...    size_t size = mem_block_size(ptr);    if (prev_allocated &amp;&amp; next_allocated) {        \/* \u0441\u043e\u0441\u0435\u0434\u0438 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u043d\u0435\u0447\u0435\u0433\u043e \u0441\u043b\u0438\u0432\u0430\u0442\u044c *\/    }    else if (prev_allocated &amp;&amp; !next_allocated) {\/\/ \u0441\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c, \u0442.\u0435. \u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0443 ptr \u0441 \u043a\u043e\u043d\u0446\u0430\/\/ \u0443\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u043c\u0435\u0441\u0442\u043e \u0438\u0437 \u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0444\u0443\u0442\u0435\u0440\u0430 \u0431\u043b\u043e\u043a\u0430 \/\/ ptr \u0438 \u0445\u0435\u0434\u0435\u0440\u0430 \u0431\u043b\u043e\u043a\u0430 \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u0441\u043b\u0438\u0432\u0430\u0435\u043c\u0441\u044f        size += mem_block_size(next) + kOverheadSize;        mem_block_put_to_header(ptr, size, kBlockFree);        void *footer = mem_block_footer(ptr);        mem_block_pack(footer, size, kBlockFree);    }    else if (!prev_allocated &amp;&amp; next_allocated) {\/\/ \u0442\u0443\u0442 \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0435\u043c \u0431\u043b\u043e\u043a ptr \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c\u0443 \u0431\u043b\u043e\u043a\u0443\/\/ \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0441\u0435 \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435        void *footer = mem_block_footer(ptr);\/\/ \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442 \u0445\u0435\u0434\u0435\u0440\u0430 ptr \u0438 \u0444\u0443\u0442\u0435\u0440\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430, \u0444\u0443\u0442\u0435\u0440 ptr \u0442\u0435\u043f\u0435\u0440\u044c \u0444\u0443\u0442\u0435\u0440\/\/ \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430        size += mem_block_size(prev) + kOverheadSize;        mem_block_put_to_header(prev, size, kBlockFree);        mem_block_pack(footer, size, kBlockFree);        return prev;    }    else if (!prev_allocated &amp;&amp; !next_allocated) {\/\/ \u0441\u043b\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0441 \u043e\u0431\u043e\u0438\u043c\u0438, \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e. \u0412\u0441\u0435 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0447\u0442\u043e \u0432\u044b\u0448\u0435\/\/ \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0445\u0435\u0434\u0435\u0440 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0438 \u0444\u0443\u0442\u0435\u0440 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e        void *header = mem_block_header(prev);        void *footer = mem_block_footer(next);\/\/ \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0447\u0442\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u044e\u0442\u0441\u044f \u0444\u0443\u0442\u0435\u0440 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e, \u0432\u0435\u0441\u044c \u043e\u0432\u0435\u0440\u0445\u0435\u0434 \u0431\u043b\u043e\u043a\u0430 ptr\/\/ \u0438 \u0445\u0435\u0434\u0435\u0440 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e, \u0442.\u0435. \u0432 \u0441\u0443\u043c\u043c\u0435, \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443 2 \u043f\u043e\u043b\u043d\u044b\u0445 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u0430        size += mem_block_size(prev) +            mem_block_size(next) + kOverheadSize * 2;        mem_block_pack(header, size, kBlockFree);        mem_block_pack(footer, size, kBlockFree);        return prev;    }    return ptr;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043a\u0430\u043a \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432.<\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 mem_realloc \u0438 mem_calloc, \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430:<\/p>\n<pre><code class=\"cpp\">void *mem_calloc(size_t num, size_t size){    size_t count = size * num;    void *p = mem_malloc(count);    if (p != nullptr) {        memset(p, 0, count);    }    return p;}void *mem_realloc(void *p, size_t new_sz){    if (!p) {        return mem_malloc(new_sz);    }    auto block = mem_malloc(new_sz);    if (block) {        memmove(block, p, min(new_sz, mem_block_size(p)));        mem_free(p);    }    return block;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u043a\u043e\u0439 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438 \u043f\u043e\u043c\u0438\u043c\u043e \u0434\u0430\u043c\u043f\u0430 \u043a\u0430\u043a \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0445\u043e\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u0443\u0447\u0438:<\/p>\n<pre><code class=\"cpp\">bool mem_check_block(void *p){    if (p) {      \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0441\u043b\u043e\u043c\u0430\u043d\u043e \u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043d\u0430\u0448 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c        if ((reinterpret_cast&lt;size_t&gt;(p) % kPointerSize) == 0) {      \/\/ \u0445\u0435\u0434\u0435\u0440 \u0438 \u0444\u0443\u0442\u0435\u0440 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u044b \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443 \u043f\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044e            if (*mem_block_header(p) == *mem_block_footer(p)) {      \/\/ \u041d\u0430 \u044d\u0442\u043e\u043c \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f :-)                return true;            }            else {                ALOGE(\"Bad block. Header and footer are not the same\");            }        }        else {            ALOGE(\"Bad block (%p). The address is not aligned by %zu\", p, kPointerSize);        }    }    else {        ALOGE(\"Bad block (%p)\", p);    }    return false;}bool mem_check(bool verbose){    char buffer[kMaxMessageLen];    if (gMemStart != nullptr &amp;&amp; gMemEnd != nullptr) {        for (void *cur_blk = mem_block_user_ptr(gMemStart);              cur_blk &lt;= mem_block_user_ptr(gMemEnd);             cur_blk = mem_block_next(cur_blk)) {            if (verbose) {                mem_print_block_to_str(cur_blk, buffer);                if (!mem_check_block(cur_blk)) {                    ALOGD(\"block %s BAD\", buffer);                    return false;                }                ALOGD(\"%s OK\", buffer);            }        }    }    return true;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">#include &lt;iostream&gt;#include &lt;memory&gt;#include &lt;vector&gt;#include &lt;string&gt;#include &lt;string.h&gt;#include \"memory.h\"#define LOG_TAG \"main\"#include \"logging.h\"#define PAGE_SIZE 4096#define HEAP_SIZE (4096 + 1000000 + 2048)#define ITEMS_NUMBER 4static char *char_alloc(size_t size) __attribute__((unused));static char *char_alloc(size_t size){    auto p = mem_malloc(size);    \/\/std::cout &lt;&lt; __func__ &lt;&lt; \": p = \" &lt;&lt; std::hex &lt;&lt; p &lt;&lt; std::endl;    return reinterpret_cast&lt;char *&gt;( p);}int main(){    std::unique_ptr&lt;char[]&gt; heap(new char[HEAP_SIZE]);    std::vector&lt;char *&gt; vptr;    vptr.reserve(ITEMS_NUMBER);    auto p = heap.get();    *p = 'a';    mem_initialize(heap.get(), HEAP_SIZE);    dump_mem();    dump_bins();    for (int i = 1; i &lt; ITEMS_NUMBER; ++i) {        vptr[i] = char_alloc(i);    }    mem_check(true);    for (int i = 1; i &lt; ITEMS_NUMBER; ++i) {        if ((i % 2) == 0) {            mem_free(vptr[i]);        }    }    dump_mem();    dump_bins();    mem_check(true);    for (int i = 0; i &lt; ITEMS_NUMBER; ++i) {        if ((i % 2) != 0) {            mem_free(vptr[i]);        }    }    dump_mem();    dump_bins();    mem_check(true);    return 0;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0432\u044b\u0432\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">D:\\osdev\\small_allocator\\cmake-build-debug\\malloc.exememory: *************************MEMORY DUMP*************************memory: service block address 000001ce78820088 size           16         size with overhead       32 state allocatedmemory: block address         000001ce788200a8 size      1006064         size with overhead  1006080 state freememory: service block address 000001ce78915aa8 size           16         size with overhead       32 state allocatedmemory: **********************END OF MEMORY DUMP**********************memory: total memory                    1006096 bytesmemory: total memory with overhead      1006144 bytesmemory: total total_blocks count              3memory: total allocated blocks                2memory: total free blocks                     1memory: block 000001ce788200a8 size 1006064 size with overhead 1006080 mem bin[255] prev addr 0000000000000000 next addr 0000000000000000memory: Total free blocks in all bins 1memory: block (000001ce78820088) header (000001ce78820080) [16:1] footer (000001ce78820098) [16:1] OKmemory: block (000001ce788200a8) header (000001ce788200a0) [16:1] footer (000001ce788200b8) [16:1] OKmemory: block (000001ce788200c8) header (000001ce788200c0) [16:1] footer (000001ce788200d8) [16:1] OKmemory: block (000001ce788200e8) header (000001ce788200e0) [16:1] footer (000001ce788200f8) [16:1] OKmemory: block (000001ce78820108) header (000001ce78820100) [1005968:0] footer (000001ce78915a98) [1005968:0] OKmemory: block (000001ce78915aa8) header (000001ce78915aa0) [16:1] footer (000001ce78915ab8) [16:1] OKmemory: *************************MEMORY DUMP*************************memory: service block address 000001ce78820088 size           16         size with overhead       32 state allocatedmemory: block address         000001ce788200a8 size           16         size with overhead       32 state allocatedmemory: block address         000001ce788200c8 size           16         size with overhead       32 state freememory: block address         000001ce788200e8 size           16         size with overhead       32 state allocatedmemory: block address         000001ce78820108 size      1005968         size with overhead  1005984 state freememory: service block address 000001ce78915aa8 size           16         size with overhead       32 state allocatedmemory: **********************END OF MEMORY DUMP**********************memory: total memory                    1006048 bytesmemory: total memory with overhead      1006144 bytesmemory: total total_blocks count              6memory: total allocated blocks                4memory: total free blocks                     2memory: block 000001ce788200c8 size 16 size with overhead 32 mem bin[16] prev addr 0000000000000000 next addr 0000000000000000memory: block 000001ce78820108 size 1005968 size with overhead 1005984 mem bin[255] prev addr 0000000000000000 next addr 0000000000000000memory: Total free blocks in all bins 2memory: block (000001ce78820088) header (000001ce78820080) [16:1] footer (000001ce78820098) [16:1] OKmemory: block (000001ce788200a8) header (000001ce788200a0) [16:1] footer (000001ce788200b8) [16:1] OKmemory: block (000001ce788200c8) header (000001ce788200c0) [16:0] footer (000001ce788200d8) [16:0] OKmemory: block (000001ce788200e8) header (000001ce788200e0) [16:1] footer (000001ce788200f8) [16:1] OKmemory: block (000001ce78820108) header (000001ce78820100) [1005968:0] footer (000001ce78915a98) [1005968:0] OKmemory: block (000001ce78915aa8) header (000001ce78915aa0) [16:1] footer (000001ce78915ab8) [16:1] OKmemory: *************************MEMORY DUMP*************************memory: service block address 000001ce78820088 size           16         size with overhead       32 state allocatedmemory: block address         000001ce788200a8 size      1006064         size with overhead  1006080 state freememory: service block address 000001ce78915aa8 size           16         size with overhead       32 state allocatedmemory: **********************END OF MEMORY DUMP**********************memory: total memory                    1006096 bytesmemory: total memory with overhead      1006144 bytesmemory: total total_blocks count              3memory: total allocated blocks                2memory: total free blocks                     1memory: block 000001ce788200a8 size 1006064 size with overhead 1006080 mem bin[255] prev addr 0000000000000000 next addr 0000000000000000memory: Total free blocks in all bins 1memory: block (000001ce78820088) header (000001ce78820080) [16:1] footer (000001ce78820098) [16:1] OKmemory: block (000001ce788200a8) header (000001ce788200a0) [1006064:0] footer (000001ce78915a98) [1006064:0] OKmemory: block (000001ce78915aa8) header (000001ce78915aa0) [16:1] footer (000001ce78915ab8) [16:1] OKProcess finished with exit code 0<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0443 \u0432\u043e\u0442 \u0438 \u0432\u0441\u0435! \u0412\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430!<\/p>\n<p>\u0414\u043e \u043d\u043e\u0432\u044b\u0445 \u0432\u0441\u0442\u0440\u0435\u0447!<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1045692\/\">https:\/\/habr.com\/ru\/articles\/1045692\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u0427\u0430\u0441\u0442\u044c 1\u0427\u0430\u0441\u0442\u044c 2\u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438\u0412 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0439\u0434\u0435\u0442 \u0440\u0435\u0447\u044c \u0443\u0436\u0435 \u043e \u0433\u043e\u0442\u043e\u0432\u043e\u043c \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438. \u041e\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d, \u043d\u043e \u0438\u0434\u0435\u044f \u0442\u0430 \u0436\u0435 \u0441\u0430\u043c\u0430\u044f, \u043d\u0435\u044f\u0432\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u0441 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u043c\u0438 \u0442\u0435\u0433\u0430\u043c\u0438 \u0441\u0432\u0435\u0440\u0445\u0443 \u0438 \u0441\u043d\u0438\u0437\u0443, \u043d\u043e \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432. \u0422.\u0435. \u043f\u043e \u0441\u0443\u0442\u0438 \u0441 \u0431\u0438\u043d\u0430\u043c\u0438.\u0411\u0438\u043d\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 256 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438. \u0411\u043b\u043e\u043a\u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0431\u0438\u043d\u0435 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0430\u0432\u0435\u043d \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u0431\u043b\u043e\u043a\u0430 \u0435\u0441\u043b\u0438 \u0431\u043b\u043e\u043a &lt;= 255 \u0431\u0430\u0439\u0442, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u043b\u0435\u0436\u0430\u0442 \u0432 \u0431\u0438\u043d\u0435 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c 255 \u0438 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443. \u0412 \u0431\u0438\u043d\u0430\u0445 \u0441 \u043c\u0435\u043d\u044c\u0448\u0438\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e O(1). \u0422\u0430\u043a \u0436\u0435 \u043f\u043e\u0438\u0441\u043a \u0431\u0438\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u044b\u043c \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0442\u0430\u043a \u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(1), \u044d\u0442\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430. \u0414\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0432 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u0441\u043f\u0438\u0441\u043a\u0435.\u0412\u043e\u0442 \u043e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430:\u0418\u043d\u0434\u0435\u043a\u0441 \u0431\u0438\u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:static size_t bin_index_from_size(size_t size){    if (size &gt;= kHugeBlockMinSize) {        return kHugeBinIndex;    }    return size;}\u0421\u0432\u044f\u0437\u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u043c payload, \u0442.\u0435. \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0435\u0441\u043b\u0438 \u0431\u043b\u043e\u043a \u0437\u0430\u043d\u044f\u0442, \u043d\u043e \u0435\u0441\u043b\u0438 \u0431\u043b\u043e\u043a \u0441\u0432\u043e\u0431\u043e\u0434\u0435\u043d, \u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u0437\u0430\u0445\u043e\u0442\u0438\u043c. \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0431\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0441 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 16 \u0431\u0430\u0439\u0442, \u0438\u043b\u0438 sizeof(void*) * 2\u042d\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 \u0441\u0442\u0438\u043b\u0435 \u0421. \u0412\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u043d\u0430 payload \u0431\u043b\u043e\u043a\u0430. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u0431\u043b\u043e\u043a\u0430\u043c\u0438, \u0430 \u043d\u0435 \u0441 \u0441\u044b\u0440\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e. \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e!\u041d\u0438\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u0441 \u0441\u044b\u0440\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e. \u0418\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u0438\u0437 \u043d\u0435\u0435 \u0431\u043b\u043e\u043a\u0438.\/** * Memory block related stuff *\/\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0442\u0438\u043f\u0430 size_t* \u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0443\u043a\u0437\u044b\u0432\u0430\u0435\u0442 __p\/\/ \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0439\u0441\u044f \u0432 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u0442\u0435\u0433\u0430\u0445static size_t *mem_block_size_t_ptr(void *_p){    return reinterpret_cast&lt;size_t *&gt;(_p);}\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0447\u0442\u043e __p \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0445\u0435\u0434\u0435\u0440\/\/ \u0438\u043b\u0438 \u0444\u0443\u0442\u0435\u0440 \u0431\u043b\u043e\u043a\u0430static size_t mem_block_get_size(void *_p){    return *mem_block_size_t_ptr(_p) &amp; ~0x01;}\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0442\u0438\u043f\u0430 char* \u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0443\u043a\u0437\u044b\u0432\u0430\u0435\u0442 __p\/\/ \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438, \u0447\u0442\u043e \u0431\u044b \u0448\u0430\u0433 \u0431\u044b\u043b \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432 \u0431\u0430\u0439\u0442static char *mem_block_char_ptr(void *_p){    return reinterpret_cast&lt;char *&gt;(_p);}\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payload \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0431\u043b\u043e\u043a\u0430\/\/ \u0412\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u043d\u0430 payloadstatic char *mem_block_user_ptr(void *_p){    return mem_block_char_ptr(_p) + kHeaderSize;}\/\/ \u0423\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u0438 \u0431\u0438\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u0421\u043e\u0431\u043e\u0434\u0435\u043d\\\u0437\u0430\u043d\u044f\u0442static void mem_block_pack(void *_p, size_t _sz, size_t _st){    *mem_block_size_t_ptr(_p) = _sz | _st;}\/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0431\u043b\u043e\u043a\u0430 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 payloadstatic char *mem_block_header(void *_p){    return mem_block_char_ptr(_p) &#8212; kHeaderSize;}\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 payloadstatic size_t mem_block_size(void *_p){    return mem_block_get_size(mem_block_header(_p));}\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u044d\u043f\u0438\u043b\u043e\u0433 \u0431\u043b\u043e\u043a\u0430 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 payloadstatic char *mem_block_footer(void *_p){    return mem_block_char_ptr(_p) + mem_block_size(_p);}\/\/ \u0427\u0438\u0442\u0430\u0435\u0442 \u0437\u0430\u043d\u044f\u0442 \u043b\u0438 \u0431\u043b\u043e\u043a \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u0442\u0435\u0433\u043e\u0432static size_t mem_block_get_alloc(void *p){    return (*mem_block_size_t_ptr(p) &amp; 0x01);}\/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043d \u043b\u0438 \u0431\u043b\u043e\u043a \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 payloadstatic bool mem_block_is_allocated(void *p){    return mem_block_get_alloc(mem_block_header(p)) == kBlockAllocated;}static bool mem_block_is_free(void *p){    return !mem_block_is_allocated(p);}\/\/ \u041a\u043b\u0430\u0434\u0435\u0442 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0431\u043b\u043e\u043a\u0430. __p \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payloadstatic void mem_block_put_to_header(void *_p, size_t _sz, size_t state){    mem_block_pack(mem_block_header(_p), _sz, state);}\/\/ \u041a\u043b\u0430\u0434\u0435\u0442 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 \u0444\u0443\u0442\u0435\u0440 \u0431\u043b\u043e\u043a\u0430. __p \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payloadstatic void mem_block_put_to_footer(void *_p, size_t _sz, size_t state){    mem_block_pack(mem_block_footer(_p), _sz, state);}\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u043b\u043e\u043a \u0438\u0437 \u043d\u0435\u044f\u0432\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430. \u0422.\u0435. \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043c\u0435\u0436\u043d\u044b\u0439 \u0431\u043b\u043e\u043a\/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payload. __p \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payloadstatic void *mem_block_next(void *_p){    return mem_block_char_ptr(_p) + mem_block_size(_p) + kOverheadSize;}\/\/ \u0422\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u0430. __p \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payload\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payloadstatic inline void *mem_block_init_block(void *_p, size_t _sz,                                         size_t state){\/\/ \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0445\u0435\u0434\u0435\u0440    mem_block_put_to_header(_p, _sz, state);\/\/ \u043f\u043e\u0442\u043e\u043c \u0444\u0443\u0442\u0435\u0440    mem_block_put_to_footer(_p, _sz, state);    return _p;}\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0431\u043b\u043e\u043a \u0438\u0437 \u043d\u0435\u044f\u0432\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430. \u0422.\u0435. \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0441\u043c\u0435\u0436\u043d\u044b\u0439 \u0431\u043b\u043e\u043a\/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payload\/\/ __p \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payloadstatic void *mem_block_prev(void *_p){    char *header = mem_block_char_ptr(mem_block_header(_p));    char *prev_footer = header &#8212; kFooterSize;    size_t prev_size = mem_block_get_size(prev_footer);    return prev_footer &#8212; prev_size;}\/\/ \u0420\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u0441 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u043e\u043c, \u0442.\u0435. \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u0444\u0443\u0442\u0435\u0440\u0430\/\/ ptr \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 payloadstatic inline size_t mem_block_size_with_overhead(void *ptr){    return mem_block_size(ptr) + kOverheadSize;}\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0441\u0435\u0431\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435. \u041e\u043d \u043a\u043b\u0430\u0434\u0435\u0442 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0432 \u0431\u0438\u043d \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c 255.int mem_initialize(void *base, size_t size){    if (base &amp;&amp; size &gt; 0 &amp;&amp; (size % 2 == 0)) {        size_t binsSize = kBinCount * sizeof(void *);        if (size &gt; binsSize) {            gMemStart = mem_block_char_ptr(base);\/\/ \u0415\u0441\u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u044d\u0442\u043e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441 \u0442\u043e \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0443\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0435 sizeof(void*) * 256 \/\/ \u0431\u0430\u0439\u0442 \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0431\u0438\u043d\u043e\u0432 \u0438\u043d\u0430\u0447\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0442\u0435\u043a\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432         #if BINS_ARE_IN_HEAP            gMemStart = mem_block_char_ptr(base) + binsSize;            size -= binsSize;            gBinList = reinterpret_cast&lt;ListHead **&gt;(base);            ALOGD(&#171;gBinList %p binsSize %zu gMemStart %p&#187;, gBinList, binsSize, gMemStart);#endif\/\/ \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0431\u0438\u043d\u044b \u0432 nullptr            memset(gBinList, 0, binsSize);\/\/ \u041f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u043b\u043e\u043a\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u043c\u0438 \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u044b\/\/ \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0441\u043b\u0438\u044f\u043d\u0438\u044f            mem_block_pack(gMemStart, kOverheadSize, kBlockAllocated);            mem_block_pack(gMemStart + kHeaderSize + kOverheadSize,                           kOverheadSize, kBlockAllocated);\/\/ \u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0443\u0447\u0438 \u043d\u0430 \u043d\u0430\/\/ 5 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u043e\u0432 \u044d\u0442\u043e \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u044b \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435        \/\/ \u0438 \u0438\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0440\u0430\u0432\u043d\u044b\u0435 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u0443 \u0431\u043b\u043e\u043a\u0430 \u0438 \u043f\u044f\u0442\u044b\u0439 \u044d\u0442\u043e \u043e\u0432\u0435\u0440\u0445\u0435\u0434 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e\/\/ \u0431\u043b\u043e\u043a\u0430            size_t heapSize = size &#8212; (kOverheadSize * 5);            void *heap = mem_block_next(mem_block_user_ptr(gMemStart));            mem_block_init_block(heap, heapSize, kBlockFree);\/\/ \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u043b\u043e\u043a \u0442\u0430\u043a \u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u043c \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043d            gMemEnd = mem_block_char_ptr(mem_block_next(heap)) &#8212; kHeaderSize;            mem_block_pack(gMemEnd, kOverheadSize, kBlockAllocated);            mem_block_pack(gMemEnd + kOverheadSize + kHeaderSize, kOverheadSize, kBlockAllocated);            auto firstBlock = mem_block_list_head(heap);\/\/ \u041f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u043a\u043b\u0430\u0434\u0435\u043c \u0432 \u0431\u0438\u043d \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0431\u043b\u043e\u043a            bin_insert(firstBlock);            return 0;        }    }    else {        ALOGE(&#171;Could not initialize memory with params base %p size %zu&#187;, base, size);    }    ALOGD(&#171;gMemStart %p gMemEnd %p size %td&#187;,          gMemStart,          gMemEnd,          mem_block_char_ptr(gMemEnd) &#8212; mem_block_char_ptr(gMemStart));    return EINVAL;}\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043a \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0438 \u043f\u043e\u0442\u0438\u0445\u043e\u043d\u044c\u043a\u0443 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0431\u0438\u043d\u0430\u043c.void *mem_malloc(size_t size){    void *block = nullptr;    if (gMemStart) {        if (size &gt; 0) {            \/\/ \u0412\u0435\u0440\u043d\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 sizeof(void*) * 2 \u0431\u0435\u0437 \u0443\u0447\u0435\u0442\u0430            \/\/ \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u0430. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0443\u0447\u0442\u0435\u043d \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 mem_block_place            size_t aligned_size = mem_block_aligned_size(size);            \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0431\u0438\u043d\u044b, \u0435\u0441\u043b\u0438 \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0435\u0433\u043e            auto memoryBlock = bin_find_free_block(aligned_size);            if (memoryBlock) {                block = memoryBlock;                \/\/ \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0438\u0437 \u0431\u0438\u043d\u0430                bin_erase(block);                \/\/ \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0431\u043b\u043e\u043a \u043e\u0442\u0440\u0435\u0437\u0430\u044f \u043e\u0442 \u043d\u0435\u0433\u043e \u043a\u0443\u0441\u043e\u043a \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e                block = mem_block_place(block, aligned_size);                \/\/ \u0415\u0441\u043b\u0438 \u043c\u044b \u043e\u0442\u0440\u0435\u0436\u0435\u043c \u043e\u0442 \u0431\u043b\u043e\u043a\u0430 \u043a\u0443\u0441\u043e\u043a, \u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0441 \u043d\u0430\u0447\u0430\u043b\u0430. \u0422\u043e\u0433\u0434\u0430                \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0431\u043b\u043e\u043a \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438 \u043c\u044b \u0432\u0437\u044f\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0433\u043e \u0447\u0430\u0441\u0442\u044c                \/\/ \u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043c\u0435\u0436\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u0435\u043d                auto next = mem_block_next(block);                if (next &lt; gMemEnd &amp;&amp; next &gt; gMemStart &amp;&amp; mem_block_is_free(next)) {                    auto nextBlock = mem_block_list_head(next);                \/\/ \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0442\u0430\u043a \u0442\u043e \u043a\u043b\u0430\u0434\u0435\u043c \u0435\u0433\u043e \u0432 \u0431\u0438\u043d                    bin_insert(nextBlock);                }            }        }        else {            ALOGE(&#171;Could not allocate block with size %zu&#187;, size);            errno = EINVAL;        }    }    else {        errno = EINVAL;        ALOGE(&#171;Not initialized&#187;);    }    return block;}\u0414\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 mem_malloc \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438:mem_block_place, bin_find_free_block \u0438 bin_insert\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 mem_block_place \u043e\u043d\u0430 \u0441\u0430\u043c\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u0445\u043e\u0442\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0439.static void *mem_block_place(void *block, size_t sz){\/\/ \u0432\u044b\u044f\u0441\u043d\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430. \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e \u043e\u043d \u0441\u0432\u043e\u0434\u043e\u0435\u043d \u0440\u0430\u0437 \u043c\u044b \u0442\u0443\u0442    size_t cur_size = mem_block_size(block);\/\/ \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043e\u0442 \u0431\u043b\u043e\u043a\u0430 \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c\/\/ \u043e\u0442\u0440\u0435\u0437\u0430\u0442\u044c \u043e\u0442 \u043d\u0435\u0433\u043e sz \u0431\u0430\u0439\u0442    size_t remain = cur_size &#8212; sz;\/\/ \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430, \u0442.\u0435. 2 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e payload \u0431\u043b\u043e\u043a\u0430\/\/ \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0432\u0435\u0440\u0445\u0435\u0434 + \u0435\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\/\/ \u0438 \u0442\u043e\u0433\u043e sizeof(void*) * 4\/\/ \u0442\u043e \u043e\u0442\u0440\u0435\u0437\u0430\u0435\u043c \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u043b\u043e\u043a\u0430 sz \u0431\u0430\u0439\u0442 \u043c\u0435\u043d\u044f\u044f \u0438\u043c\u0435\u044e\u0449\u0438\u0439\u0441\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a    if (remain &gt;= kOverheadSize * 2) {\/\/ \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044f \u0432 \u0440\u0430\u0441\u0447\u0435\u0442 \u0447\u0442\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u0444\u0443\u0442\u0435\u0440 \u0438 \u043d\u043e\u0432\u044b\u0439&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-483057","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483057","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=483057"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483057\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=483057"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=483057"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=483057"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}