{"id":336114,"date":"2022-07-25T03:00:05","date_gmt":"2022-07-25T03:00:05","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=336114"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=336114","title":{"rendered":"<span>\u0412\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u043b\u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 Garbage collector \u043d\u0430 \u0421++?<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b4d\/6b2\/8a9\/b4d6b28a9cb040bbff20f8e00d71811a.png\" width=\"780\" height=\"440\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b4d\/6b2\/8a9\/b4d6b28a9cb040bbff20f8e00d71811a.png\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438<\/h2>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0443 \u0434\u043e\u043b\u0433\u043e \u0440\u0430\u0441\u0441\u0443\u0441\u043e\u043b\u0438\u0432\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 \u0438 \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043e\u043d \u043d\u0443\u0436\u0435\u043d (\u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0442\u0430\u0442\u0435\u0439). \u041d\u043e \u0445\u043e\u0447\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u044b\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439.<\/p>\n<ol>\n<li>\n<p>\u0421\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 &#8212; \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 &#171;\u0443\u043c\u043d\u044b\u0445&#187; \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0441++ \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0432\u044b\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0435 \u0432 \u0441\u0430\u043c\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435, \u0430 \u0432 \u043d\u0435\u043a\u043e\u043c \u043e\u0434\u043d\u043e\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435. \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0430 \u0432\u0441\u0435\u0445, \u0438\u043b\u0438 \u043f\u043e\u0440\u0446\u0438\u0438 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 &#8212; \u043d\u0435 \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440. \u0425\u043e\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f\/\u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438\/\u0434\u0435\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043a\u0443\u0447\u0438, \u043d\u043e \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 \u043d\u0435 \u043f\u0440\u0438\u0437\u0432\u0430\u043d \u0435\u0435 \u0440\u0435\u0448\u0430\u0442\u044c. \u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u043e\u043c, \u043d\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0435\u0433\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0430\u043c\u044f\u0442\u044c \u043e\u0447\u0438\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0445\u0430\u043e\u0442\u0438\u0447\u043d\u043e \u0438 \u043d\u0435 &#171;\u043b\u0430\u0432\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e&#187;.<\/p>\n<\/li>\n<\/ol>\n<h2>\u0427\u0442\u043e \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c?<\/h2>\n<p>\u041f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 (\u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0435 \u043f\u0440\u0430\u0432\u0434\u0430 \u043b\u0438?). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 \u0438 \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u0436\u0430\u0442\u044c \u0438\u0437 \u043d\u0435\u0433\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044e \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0438\u043c\u0430 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 c-style \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u044a\u0435\u043c \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0440\u043e\u0431\u043e\u0442\u044b \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u043d\u043e \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0431\u043e\u0440\u0449\u0438\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0440\u0430\u0432\u043d\u0438 &#171;\u0443\u043c\u043d\u044b\u043c&#187; \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0436\u0438\u0437\u043d\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 &#8212; \u043e\u0431\u044a\u0435\u043a\u0442 \u0436\u0438\u0432 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0442\u043e-\u0442\u043e, \u043a\u0442\u043e \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0433\u043e, \u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0418\u0434\u0435\u044f \u0438 \u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435<\/h2>\n<p>\u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 &#171;\u0443\u043c\u043d\u044b\u0445&#187; \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043c \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u043d\u0435\u043a\u0438\u0439 singleton.<\/p>\n<p>\u0414\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043b\u0438\u0446\u0430: <\/p>\n<pre><code class=\"cpp\">template&lt;typename T> struct TGCPointer; \/\/\u043d\u0430\u0448 \u0443\u043c\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c class GGarbageCollector; \/\/ \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430<\/code><\/pre>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u043e\u0434 \u0441\u043b\u0430\u0431\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0448\u0430 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0430 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043b\u0430\u0431\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0441\u0447\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u043c \u043c\u0443\u0441\u043e\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u0443\u043c\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0431\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0441\u043b\u0430\u0431\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0438, \u043b\u0438\u0431\u043e \u0432 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0441 \u0440\u0443\u0447\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<pre><code class=\"cpp\">TGCPointer&lt;int> A; \/\/ \u0441\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 int* B; \/\/\u0441\u043b\u0430\u0431\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430<\/code><\/pre>\n<p><strong>1) \u041d\u0430\u0447\u0430\u043b\u043e<\/strong><\/p>\n<p>\u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<p><strong>GGarbageCollector<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/* Main garbage manager. *\/ class GGarbageCollector {  public:  static inline GGarbageCollector* Get() { static GGarbageCollector GC; return &amp;GC; }  private:  inline GGarbageCollector() {}    public:  \/* Force collect garbage. *\/ inline void ForceGC() {  \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 } \/* @return total objects count who are under surveillance. *\/ inline unsigned int GetTotalObjectsCount() const noexcept { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 } \/* @return the number of objects destroyed at the last iteration of garbage collection. *\/ inline unsigned int GetLastGarbagedObjectsCount() const noexcept { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 } \/* @return index of the garbage collection iteration. *\/ inline unsigned int GetGarbageCollectionIndex() const noexcept { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 }  \/* Check that object address is in GarbageCollector. *\/ inline bool IsGCObjectValid(const void* Object) const noexcept { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 } \/* Check that object address is in GarbageCollector and hasn't got any refs. *\/ inline bool IsGCObjectPendingToKill(const void* Object) const noexcept { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 } };<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u043d\u0430\u0448 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u0443\u043c\u0435\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u0443\u0441\u043e\u0440, \u043d\u043e \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430. \u0410\u0434\u0440\u0435\u0441 &#8212; \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043e\u0431 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435, \u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0442\u043e\u0442 \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u0431\u044b\u043b \u0432\u0438\u0434\u0435\u043d \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0443, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435.  <\/p>\n<p><strong>TGCPointer<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">template&lt;typename T> struct TGCPointer {  public:  inline TGCPointer() {} inline TGCPointer(T* InObject) : Object(InObject) { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 } inline TGCPointer(T* InObject, bool IsNew) : Object(InObject) { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 } inline TGCPointer(const TGCPointer&amp; OtherGCPointer) : Object(OtherGCPointer.Object) { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 } inline TGCPointer(TGCPointer&amp;&amp; OtherGCPointer) noexcept : Object(OtherGCPointer.Object) { OtherGCPointer.Object = nullptr; }  ~TGCPointer() { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 }  public:  operator bool() { return IsValid(); }  operator T*() { return Object; }  inline T&amp; operator*() const { return *Object; }  inline T* operator->() const { return Object; }  inline TGCPointer&amp; operator=(const TGCPointer&amp; InGCPointer) { if (InGCPointer.Object == Object) return *this;  \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435  return *this; } inline TGCPointer&amp; operator=(TGCPointer&amp;&amp; InGCPointer) { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435  return *this; } inline TGCPointer&amp; operator=(T* Ptr) { if (Ptr == Object) return *this;  \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435  return *this; }    \/\/ \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0443\u0441\u0442\u0438\u043b, \u043e\u043d\u0438 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b   public:  inline bool IsValid() const noexcept { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 }  inline T* Get() const noexcept { return Object; }  inline T* GetChecked() const noexcept { if (!IsValid()) { Object = nullptr; } return Object; }  inline void Reset() { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 Object = nullptr; }    private:  \/* Owned object. *\/ T* Object = nullptr; };   template&lt;typename T, typename... Args> TGCPointer&lt;T> MakeGCPointer(...) { return TGCPointer&lt;T>(new T(Args...)); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0417\u0434\u0435\u0441\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f. \u041d\u0430\u0448 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u043e\u0439 \u043d\u0430\u0434 \u0441\u0438\u0448\u043d\u044b\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c, \u043d\u043e \u0443\u043c\u0435\u0435\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 (\u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430). \u0421\u043b\u0430\u0431\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u0432 \u0432\u0438\u0434\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430.<\/p>\n<p>\u0418\u0437 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u043e \u0432\u0438\u0434\u043d\u0430 \u043c\u0435\u0447\u0442\u0430 &#8212; \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043e \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u043a\u0430\u043a \u0447\u0438\u0441\u043b\u0430.<\/p>\n<p><strong>2) \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/strong><\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0447\u0442\u043e-\u0442\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430, \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043c\u0435\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0435\u043c. \u0412 \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c <em>TGCPointer, <\/em>\u043d\u043e \u043a\u0430\u043a \u0435\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c? <\/p>\n<p>\u0414\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043d\u0430\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043e\u0434\u043d\u043e\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a. \u041d\u043e \u043a\u0430\u043a \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u044f? \u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u044d\u0442\u0438\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c. \u041d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a. \u0417\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\u044e. \u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u043e\u0434\u043d\u043e\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a. \u0422\u0430\u043a \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u0430 const + \u0447\u0438\u0441\u043b\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 * \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u043e\u0431\u044a\u0435\u043a\u0442\u0435.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/782\/35a\/095\/78235a095f0b5179230a2ad6e07eb576.png\" width=\"400\" height=\"200\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/782\/35a\/095\/78235a095f0b5179230a2ad6e07eb576.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0435 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430, \u0430 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c \u043d\u0435\u043a\u043e\u0439 \u0435\u0433\u043e \u0447\u0430\u0441\u0442\u0438. \u0425\u043e\u0442\u044c \u043c\u044b \u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043b\u0443\u0447\u0448\u0435 \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u043a\u0443 (\u0432\u0441\u0435 \u0435\u0449\u0435 O(n)), \u043d\u043e \u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 (2^k). \u042d\u0442\u0443 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0439(65536 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e 64 KB \u0438\u043b\u0438 1048576, \u0447\u0442\u043e \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e 1 MB) \u041f\u043e \u0437\u0430\u043c\u0435\u0440\u0430\u043c (\u043e \u043d\u0438\u0445 \u0432 \u043a\u043e\u043d\u0446\u0435), \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u0440\u043e\u0441\u0442\u0430 \u043d\u0435 \u0434\u0430\u044e\u0442. \u0422\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043d\u0430\u0448 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u0435\u043d\u0435\u0435 \u0441 \u0447\u0435\u043c 2-3 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043d\u043e \u0434\u043b\u044f \u0438\u0433\u0440 \u044d\u0442\u043e\u0433\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e + \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e (\u043d\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e) \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043e\u0447\u0438\u0441\u0442\u043a\u0443.<\/p>\n<p>\u042d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c, \u0434\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f.<\/p>\n<p><strong>3) \u041e\u0431\u043c\u0430\u0436\u0435\u043c\u0441\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f\u043c\u0438<\/strong><\/p>\n<p><strong>FAddrHandler<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/* Helper struct to handle object references. *\/ struct FAddrHandler {  public:  inline FAddrHandler() noexcept { } inline FAddrHandler(size_t InAddr, unsigned int InCount) noexcept : Addr(InAddr), Count(InCount) { } inline FAddrHandler(size_t InAddr) noexcept : Addr(InAddr) { } inline FAddrHandler(const void* Ptr, unsigned int InCount) noexcept : Addr((size_t)Ptr), Count(InCount) { } inline FAddrHandler(const void* Ptr) noexcept : Addr((size_t)Ptr) { }   public:  \/* Check that this handler represent any object. *\/ inline bool IsValid() const noexcept { return Addr != 0; } \/* Check that this object is a candidate to killing by any Garbage Collector. @return true if this handler has object, but it has no references. *\/ inline bool IsPendingToKill() const noexcept { return Count == 0 &amp;&amp; Addr != 0; }   public:  \/* Object's memory address in integral type. *\/ size_t Addr = 0; \/* Number of references to an object in the program. *\/ unsigned int Count = 0; };  \/\/ \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0443\u0441\u0442\u0438\u043b, \u043e\u043d\u0438 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0443\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e. \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 \u0441\u0441\u044b\u043b\u043e\u043a.<\/p>\n<p><strong>FAnyPtrMap<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/* Helper struct for manage AddrHandlers. @see FAddrHandler. *\/ struct FAnyPtrMap {  public:  inline FAnyPtrMap() : { ItemMap = new std::forward_list&lt;FAddrHandler>[BitsPackSize]; }  ~FAnyPtrMap() { if (ItemMap != nullptr) delete[] ItemMap; }    public:  FAddrHandler* AddPtr(const void* Ptr) { \/\/if (Ptr == nullptr) return; \/\/check  const size_t LAddr = (const size_t)Ptr;  std::forward_list&lt;FAddrHandler>&amp; LItems = ItemMap[GetLocalAddr(LAddr)]; auto LItemsEnd = LItems.end();  auto LAddrHandler = std::find(LItems.begin(), LItemsEnd, LAddr); if (LAddrHandler != LItemsEnd) { ++LAddrHandler->Count; return &amp;LAddrHandler._Ptr->_Myval; } else { ++TotalObjectsCount; LItems.push_front(FAddrHandler(LAddr, 1)); return &amp;LItems.front(); } }  FAddrHandler* AddNewPtr(const void* Ptr) { \/\/if (Ptr == nullptr) return; \/\/check  const size_t LAddr = (const size_t)Ptr;  std::forward_list&lt;FAddrHandler>&amp; LItems = ItemMap[GetLocalAddr(LAddr)];  ++TotalObjectsCount; LItems.push_front(FAddrHandler(LAddr, 1)); return &amp;LItems.front(); }  FAddrHandler* RemovePtr(const void* Ptr) { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 }  inline void RemovePtrByHandler(FAddrHandler* PtrHandler) { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 }  void ClearInvalidPtrs() { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 }    FAddrHandler* GetPtrHandler(const void* Ptr) const noexcept { \/\/if(Ptr == nullptr); \/\/check  const size_t LAddr = (const size_t)Ptr; const std::forward_list&lt;FAddrHandler>&amp; LItems = ItemMap[GetLocalAddr(LAddr)]; auto LItemsEnd = LItems.end();  auto LAddrHandler = std::find(LItems.begin(), LItemsEnd, LAddr); if (LAddrHandler == LItemsEnd) return nullptr;  return &amp;LAddrHandler._Ptr->_Myval; }  inline unsigned int GetTotalObjectsCount() const noexcept { return TotalObjectsCount; }  inline unsigned int GetLastGarbagedObjectsCount() const noexcept { return LastGarbagedObjectsCount; }  inline int GetGarbageCollectionIndex() const noexcept { return GarbageCollectionIndex; }   private:  inline unsigned int GetLocalAddr(size_t Addr) const noexcept { return Addr &amp; BitsPackMask; \/\/ Addr % BitsPackSize }    public:  const static unsigned int BitsPackSize = 1048576; \/\/1 MB ~69MB in ram const static int BitsPackMask = 0xfffff; \/\/ 20 bits 2^20 = 1048576  \/\/const static unsigned int BitsPackSize = 65536; \/\/64 KB ~4MB in ram \/\/const static int BitsPackMask = 0xffff; \/\/ 16 bits 2^16 = 65536  private:  std::forward_list&lt;FAddrHandler>* ItemMap = nullptr;   \/* Total objects count who are under surveillance. *\/ unsigned int TotalObjectsCount = 0; \/* The number of objects destroyed at the last iteration of ClearInvalidPtrs. *\/ unsigned int LastGarbagedObjectsCount = 0; \/* Index of ClearInvalidPtrs iteration. *\/ int GarbageCollectionIndex = 0; };<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0417\u0434\u0435\u0441\u044c \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430. \u0417\u0430\u043c\u0435\u0447\u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\n<p>\u0418\u043c\u0435\u0435\u043c \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041e\u0434\u0438\u043d \u043e\u0431\u044b\u0447\u043d\u044b\u0439 (\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043e\u043d \u043d\u043e\u0432\u044b\u0439), \u0432\u0442\u043e\u0440\u043e\u0439 \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u042d\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u043e\u0447\u043d\u043e \u043d\u043e\u0432\u044b\u0439.<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0432\u0437\u044f\u0442\u0438\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u043e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u041d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0440\u0430\u0442\u043d\u043e \u0434\u0432\u043e\u0439\u043a\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e (\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0430\u043c \u0431\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b, \u043d\u043e \u0442\u0430\u043a \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u0435\u0435).<\/p>\n<\/li>\n<\/ul>\n<p><strong>FGCPointerBase<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/* Base class for GC pointers. *\/ struct FGCPointerBase {  public:  inline FGCPointerBase() {} inline FGCPointerBase(const FGCPointerBase&amp; OtherGCPointerBase) noexcept : SyncAddrHandler(OtherGCPointerBase.SyncAddrHandler), SyncIndex(OtherGCPointerBase.SyncIndex) { } inline FGCPointerBase(FGCPointerBase&amp;&amp; OtherGCPointerBase) noexcept: SyncAddrHandler(OtherGCPointerBase.SyncAddrHandler), SyncIndex(OtherGCPointerBase.SyncIndex) { OtherGCPointerBase.SyncAddrHandler = nullptr; }   protected:  \/* Initialize from other FGCPointerBase. *\/ inline void SyncInitFrom(const FGCPointerBase&amp; Other) noexcept { SyncAddrHandler = Other.SyncAddrHandler; SyncIndex = Other.SyncIndex; }  \/* @param Ptr - Owned object to sync check. @return true if this GCPointer synchronized with GC. *\/ inline bool IsSync(const void* Ptr) const noexcept { return SyncAddrHandler != nullptr &amp;&amp; GGarbageCollector::Get()->GetGarbageCollectionIndex() == SyncIndex &amp;&amp; *SyncAddrHandler == Ptr; }  \/* Force synchronize this pointer with GC.  @return synchronization success. *\/ inline bool Sync(const void* Ptr) const noexcept { if (Ptr == nullptr) { SyncAddrHandler = nullptr; return false; }  GGarbageCollector* LGC = GGarbageCollector::Get(); if (SyncAddrHandler != nullptr &amp;&amp; LGC->GetGarbageCollectionIndex() == SyncIndex &amp;&amp; *SyncAddrHandler == Ptr) return true;  SyncAddrHandler = LGC->GetPtrHandler(Ptr); SyncIndex = LGC->GetGarbageCollectionIndex();  return SyncAddrHandler != nullptr; }  \/* @param Ptr - Owned object to synchronized register in GC. *\/ inline void SyncRegister(const void* Ptr) { if (Ptr == nullptr) { SyncAddrHandler = nullptr; return; }  GGarbageCollector* LGC = GGarbageCollector::Get(); if (SyncAddrHandler != nullptr &amp;&amp; LGC->GetGarbageCollectionIndex() == SyncIndex &amp;&amp; *SyncAddrHandler == Ptr) { ++SyncAddrHandler->Count; } else { SyncAddrHandler = LGC->RegisterObjectRef(Ptr); SyncIndex = LGC->GetGarbageCollectionIndex(); } }  \/* @param Ptr - Owned object which is exactly new for GC. *\/ inline void SyncRegisterExactlyNew(const void* Ptr) { if (Ptr == nullptr) { SyncAddrHandler = nullptr; return; }  GGarbageCollector* LGC = GGarbageCollector::Get();  SyncAddrHandler = LGC->RegisterExactlyNewObjectRef(Ptr); SyncIndex = LGC->GetGarbageCollectionIndex(); }  \/* @param Ptr - owned object to synchronized unregister in GC. *\/ inline void SyncUnregister(const void* Ptr) { if (Ptr == nullptr) { SyncAddrHandler = nullptr; return; }  GGarbageCollector* LGC = GGarbageCollector::Get(); if (SyncAddrHandler != nullptr &amp;&amp; LGC->GetGarbageCollectionIndex() == SyncIndex &amp;&amp; *SyncAddrHandler == Ptr) { LGC->UnregisterObjectRefByHandler(SyncAddrHandler); } else { \/\/if Count == 0 SyncAddrHandler will be nullptr SyncAddrHandler = LGC->UnregisterObjectRef(Ptr); } }   private:  mutable GarbageCollector_Private::FAddrHandler* SyncAddrHandler = nullptr; mutable int SyncIndex = -1; };<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0415\u0449\u0435 \u043e\u0434\u043d\u0430 \u0432\u0430\u0436\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u0441\u0443\u0449\u0430 &#171;\u0443\u043c\u043d\u044b\u043c&#187; \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0435\u0435 \u0442\u043e\u0436\u0435 \u0438\u043c\u0435\u0442\u044c. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 &#171;\u0443\u043c\u043d\u044b\u0445&#187; \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u0445 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0441\u044b\u043b\u043e\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0442\u0430\u043a \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0430\u043c \u0442\u043e\u0436\u0435 \u0442\u0430\u043a \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c. \u0412\u0435\u0434\u044c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0430\u0449\u0435 \u043e\u0447\u0438\u0441\u0442\u043a\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u0441\u043e \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u043c \u043e \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438, \u0430 \u0434\u0430\u043b\u0435\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043e\u0447\u0438\u0441\u0442\u043a\u0438, \u0434\u0430 \u0438 \u0442\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a  \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e.<\/p>\n<p><strong>\u0412\u043e\u0442 \u0432\u043e \u0447\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0438\u0441\u044c \u043d\u0430\u0448\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b:<\/strong><\/p>\n<p><strong>GGarbageCollector<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/* Main garbage manager. *\/ class GGarbageCollector { friend struct FGCPointerBase;  public:  static inline GGarbageCollector* Get() { static GGarbageCollector GC; return &amp;GC; }  private:  inline GGarbageCollector() {}    public:  \/* Force collect garbage. *\/ inline void ForceGC() {  PtrMap.ClearInvalidPtrs(); } \/* @return total objects count who are under surveillance. *\/ inline unsigned int GetTotalObjectsCount() const noexcept { return PtrMap.GetTotalObjectsCount(); } \/* @return the number of objects destroyed at the last iteration of garbage collection. *\/ inline unsigned int GetLastGarbagedObjectsCount() const noexcept { return PtrMap.GetLastGarbagedObjectsCount(); } \/* @return index of the garbage collection iteration. *\/ inline unsigned int GetGarbageCollectionIndex() const noexcept { return PtrMap.GetGarbageCollectionIndex(); }  \/* Check that object address is in GarbageCollector. *\/ inline bool IsGCObjectValid(const void* Object) const noexcept { return PtrMap.GetPtrHandler(Object) != nullptr; } \/* Check that object address is in GarbageCollector and hasn't got any refs. *\/ inline bool IsGCObjectPendingToKill(const void* Object) const noexcept { const GarbageCollector_Private::FAddrHandler* LAddrHandler = PtrMap.GetPtrHandler(Object); return LAddrHandler != nullptr &amp;&amp; LAddrHandler->IsPendingToKill(); }    \/\/for FGCPointerBase protected:  inline GarbageCollector_Private::FAddrHandler* RegisterObjectRef(const void* Object) { return PtrMap.AddPtr(Object); }  inline GarbageCollector_Private::FAddrHandler* RegisterExactlyNewObjectRef(const void* Object) { return PtrMap.AddNewPtr(Object); }  inline GarbageCollector_Private::FAddrHandler* UnregisterObjectRef(const void* Object) { return PtrMap.RemovePtr(Object); }  inline void UnregisterObjectRefByHandler(GarbageCollector_Private::FAddrHandler* PtrHandler) { PtrMap.RemovePtrByHandler(PtrHandler); }  inline GarbageCollector_Private::FAddrHandler* GetPtrHandler(const void* Object) { return PtrMap.GetPtrHandler(Object); }    private:  \/* Storage of object ptrs. *\/ GarbageCollector_Private::FAnyPtrMap PtrMap; };<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><strong>TGCPointer<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">template&lt;typename T> struct TGCPointer : public FGCPointerBase {  public:  inline TGCPointer() {} inline TGCPointer(T* InObject) : Object(InObject) { SyncRegister(InObject); } inline TGCPointer(T* InObject, bool IsNew) : Object(InObject) { if (IsNew) { SyncRegisterExactlyNew(InObject); } else { SyncRegister(InObject); } } inline TGCPointer(const TGCPointer&amp; OtherGCPointer) : FGCPointerBase(OtherGCPointer), Object(OtherGCPointer.Object) { SyncRegister(Object); } inline TGCPointer(TGCPointer&amp;&amp; OtherGCPointer) noexcept : FGCPointerBase(OtherGCPointer), Object(OtherGCPointer.Object) { OtherGCPointer.Object = nullptr; }  ~TGCPointer() { SyncUnregister(Object); }  public:  operator bool() { return IsValid(); }  operator T*() { return Object; }  inline T&amp; operator*() const { return *Object; }  inline T* operator->() const { return Object; }  inline TGCPointer&amp; operator=(const TGCPointer&amp; InGCPointer) { if (InGCPointer.Object == Object) return *this;  SyncUnregister(Object); Object = InGCPointer.Object; SyncInitFrom(InGCPointer); SyncRegister(Object);  return *this; } inline TGCPointer&amp; operator=(TGCPointer&amp;&amp; InGCPointer) { SyncUnregister(Object);  SyncInitFrom(InGCPointer); Object = InGCPointer.Object; InGCPointer.Object = nullptr;  return *this; } inline TGCPointer&amp; operator=(T* Ptr) { if (Ptr == Object) return *this;  SyncUnregister(Object); Object = Ptr; SyncRegister(Object);  return *this; }  \/\/ \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0443\u0441\u0442\u0438\u043b  public:  inline bool IsValid() const noexcept { \/\/if Object not in GC or Object == nullptr then we will be not sync return Sync(Object); }  inline T* Get() const noexcept { return Object; }  inline T* GetChecked() const noexcept { if (!IsValid()) { Object = nullptr; } return Object; }  inline void Reset() { SyncUnregister(Object); Object = nullptr; }    private:  \/* Owned object. *\/ T* Object = nullptr; };<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f, \u0438\u0431\u043e \u043c\u044b \u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u044b\u0434\u0430\u0441\u0442 \u043d\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441, \u043d\u0435 \u0437\u0430\u043d\u044f\u0442\u044b\u0439.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043d\u0430\u0448\u0438\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u043c\u0430 \u0441 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f, \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0438 \u043a\u0430\u043a\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u0410 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0447\u0443\u0442\u044c \u043b\u0438 \u043d\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0444\u0438\u0447\u0430.<\/p>\n<p><strong>4) \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0448\u0442\u0440\u0438\u0445\u0438<\/strong><\/p>\n<p>\u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 \u0441\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438. \u0410 \u044d\u0442\u043e 50% \u0443\u0441\u043f\u0435\u0445\u0430 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430. \u041f\u043e\u0440\u0430 \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c.<\/p>\n<p>\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 <strong>FAnyPtrMap. <\/strong>\u041b\u043e\u0431\u043e\u0432\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u0432\u0441\u0435\u043c \u044f\u0447\u0435\u0439\u043a\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043f\u0440\u043e\u0438\u0442\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 <em>PendingToKill<\/em> \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u041d\u043e \u044d\u0442\u043e \u0434\u043e\u043b\u0433\u043e. \u041f\u043e \u0441\u0443\u0442\u0438 \u0442\u0430\u043a \u043c\u044b \u0442\u0435\u0440\u044f\u0435\u043c \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438\u0437-\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\/\u0447\u0442\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u041d\u0435 \u0431\u0435\u0434\u0430! \u041f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 <em>RemovePtr<\/em> \u0438\u043b\u0438 <em>RemovePtrByHandler<\/em>) \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u043e\u043c\u0435\u0440 \u044f\u0447\u0435\u0439\u043a\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 &#171;\u043c\u0430\u0441\u0441\u0438\u0432&#187;. \u041f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u043c\u0443\u0441\u043e\u0440\u0430 \u0431\u0443\u0434\u0435\u043c \u0438\u0442\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0436\u0435 \u043f\u043e \u043d\u0435\u043c\u0443. \u0422\u0430\u043a \u043c\u044b \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u0445\u043e\u043b\u043e\u0441\u0442\u044b\u0445 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439.<\/p>\n<p>\u0414\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u0430, \u0447\u0442\u043e \u044f\u0447\u0435\u0439\u043a\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u0430 \u043a\u0430\u043a \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442 \u043d\u0430 \u0438\u0442\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0447\u0438\u0441\u0442\u043a\u0438, \u0437\u0430\u0432\u0435\u0434\u0435\u043c \u043c\u0430\u0441\u043a\u0443 \u044f\u0447\u0435\u0435\u043a. \u041f\u043e-\u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443 &#8212; \u0435\u0449\u0435 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0443\u043b\u043e\u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044f\u0447\u0435\u0435\u043a \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430.<br \/>\u041a\u0430\u043a \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0431\u0443\u043b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 1 \u0431\u0430\u0439\u0442, \u0442.\u0435 7 \u0431\u0438\u0442 \u043b\u0435\u0436\u0430\u0442 \u0432\u043f\u0443\u0441\u0442\u0443\u044e. \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u0438 \u044d\u0442\u043e(\u043c\u044b \u0438 \u0442\u0430\u043a \u043a\u0443\u0447\u0443 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0436\u0440\u0430\u043b\u0438).<\/p>\n<p><strong>TGarbageBoolMask<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/* Large bool mask for memory optimization in GC. Each bit is 0\/1 mask.  @param T - Container POD-type of the mask elements. @param BitsPackSize - mask size. *\/ template&lt;typename T, int BitsPackSize> struct TGarbageBoolMask {  public:  inline TGarbageBoolMask() { BoolMask = new T[BitsPackSize \/ MaskSize]; Clear(); }  ~TGarbageBoolMask() { if (BoolMask != nullptr) delete[] BoolMask; }   public:  \/* Set mask bit to 1. @return bit set success. *\/ inline bool SetMaskBit(int Index) noexcept { const int LMaskIndex = Index \/ MaskSize;  \/\/ 1 &lt;&lt; (Index % 8) - for char(1 byte) const T LBitIndexMask = (T)1 &lt;&lt; (Index &amp; PackTypeRemainMask);  \/\/BoolMask[Index \/ 8] &amp; (1 &lt;&lt; (Index % 8)) - for char(1 byte) const bool IsSet = BoolMask[LMaskIndex] &amp; LBitIndexMask; if (IsSet) return false;  \/\/BoolMask[Index \/ 8] |= (1 &lt;&lt; (Index % 8)) - for char(1 byte) BoolMask[LMaskIndex] |= LBitIndexMask;  return true; }  \/* Set mask bit to 0. *\/ inline void ClearMaskBit(int Index) noexcept { \/\/BoolMask[Index \/ 8] &amp;= ~(1 &lt;&lt; (Index % 8)) - for char(1 byte) BoolMask[Index \/ MaskSize] &amp;= ~((T)1 &lt;&lt; (Index &amp; PackTypeRemainMask)); }  \/* Set mask to 0. *\/ inline void Clear() { for (T* LMaskElem = BoolMask + BitsPackSize \/ MaskSize - 1; LMaskElem >= BoolMask; --LMaskElem) { *LMaskElem = 0; } }   private:  const static int MaskSize = sizeof(T) * 8; const static int PackTypeRemainMask = sizeof(T) * 8 - 1;  T* BoolMask = nullptr; };<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0437\u0430\u043f\u0430\u043a\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u0431\u0443\u043b\u044b.<\/p>\n<p><strong>FGarbageListsToClearArray<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/* Helper struct to manage of garbage lists to be cleared. *\/ struct FGarbageListsToClearArray {  public:  FGarbageListsToClearArray() = delete; inline FGarbageListsToClearArray(int ListsCount) : MaxListsCount(ListsCount) { IndexesToClean = new int[ListsCount]; }  ~FGarbageListsToClearArray() { if (IndexesToClean != nullptr) delete[] IndexesToClean; }  public:  inline int&amp; operator[](int Index) { \/\/check Index &lt; CountOfListsToClean  return IndexesToClean[Index]; }   public:  \/* Add new list index to array. *\/ inline void Push(int Index) { \/\/check CountOfListsToClean &lt; MaxListsCount  IndexesToClean[CountOfListsToClean] = Index; ++CountOfListsToClean; }  \/* @return count of lists to clear. *\/ inline int Num() const noexcept { return CountOfListsToClean; }  \/* Remove all lists from array. *\/ inline void Clear() noexcept { CountOfListsToClean = 0; }  \/* Check if any list has been pushed. *\/ inline bool IsEmpty() const noexcept { return CountOfListsToClean == 0; }    private:  \/* Array of list indexes. *\/ int* IndexesToClean = nullptr; \/* Count of pushed lists. *\/ int CountOfListsToClean = 0; \/* Max count of lists indexes to contain. *\/ int MaxListsCount = 0; };<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0443\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0441\u0442\u0435\u043a \u043d\u0430 \u0431\u0430\u0437\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u042d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438.<\/p>\n<p><strong>\u0412\u043e\u0442 \u0432\u043e \u0447\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0441\u044f FAnyPtrMap<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/* Helper struct for manage AddrHandlers. @see FAddrHandler. *\/ struct FAnyPtrMap {  public:  inline FAnyPtrMap() : ListsIndexesToClean(BitsPackSize) { ItemMap = new std::forward_list&lt;FAddrHandler>[BitsPackSize]; }  ~FAnyPtrMap() { if (ItemMap != nullptr) delete[] ItemMap; }    public:  FAddrHandler* AddPtr(const void* Ptr) { \/\/if (Ptr == nullptr) return; \/\/check  const size_t LAddr = (const size_t)Ptr;  std::forward_list&lt;FAddrHandler>&amp; LItems = ItemMap[GetLocalAddr(LAddr)]; auto LItemsEnd = LItems.end();  auto LAddrHandler = std::find(LItems.begin(), LItemsEnd, LAddr); if (LAddrHandler != LItemsEnd) { ++LAddrHandler->Count; return &amp;LAddrHandler._Ptr->_Myval; } else { ++TotalObjectsCount; LItems.push_front(FAddrHandler(LAddr, 1)); return &amp;LItems.front(); } }  FAddrHandler* AddNewPtr(const void* Ptr) { \/\/if (Ptr == nullptr) return; \/\/check  const size_t LAddr = (const size_t)Ptr;  std::forward_list&lt;FAddrHandler>&amp; LItems = ItemMap[GetLocalAddr(LAddr)];  ++TotalObjectsCount; LItems.push_front(FAddrHandler(LAddr, 1)); return &amp;LItems.front(); }  FAddrHandler* RemovePtr(const void* Ptr) { \/\/if (Ptr == nullptr) return; \/\/check  const size_t LAddr = (const size_t)Ptr;  const unsigned int LocalAddr = GetLocalAddr(LAddr); std::forward_list&lt;FAddrHandler>&amp; LItems = ItemMap[LocalAddr]; auto LItemsEnd = LItems.end();  auto LAddrHandler = std::find(LItems.begin(), LItemsEnd, LAddr); if (LAddrHandler == LItemsEnd || LAddrHandler->Count == 0) return nullptr;  if (--LAddrHandler->Count == 0) { if (ListsIndexesToCleanMask.SetMaskBit(LocalAddr)) { ListsIndexesToClean.Push(LocalAddr); } }  return &amp;LAddrHandler._Ptr->_Myval; }  inline void RemovePtrByHandler(FAddrHandler* PtrHandler) { if (PtrHandler == nullptr || PtrHandler->Count == 0 || !PtrHandler->IsValid()) return;  if (--PtrHandler->Count == 0) { const unsigned int LocalAddr = GetLocalAddr(PtrHandler->Addr); if (ListsIndexesToCleanMask.SetMaskBit(LocalAddr)) { ListsIndexesToClean.Push(LocalAddr); } } }  void ClearInvalidPtrs() { LastGarbagedObjectsCount = 0; if (ListsIndexesToClean.IsEmpty()) return;  ++GarbageCollectionIndex; for (int i = 0; i &lt; ListsIndexesToClean.Num(); ++i) { ItemMap[ListsIndexesToClean[i]].remove_if([this](FAddrHandler&amp; LAddrHandler) { if (!LAddrHandler.IsPendingToKill()) return false;  delete (void*)LAddrHandler.Addr; ++LastGarbagedObjectsCount; return true; });  ListsIndexesToCleanMask.ClearMaskBit(ListsIndexesToClean[i]); }  TotalObjectsCount -= LastGarbagedObjectsCount; ListsIndexesToClean.Clear(); }    FAddrHandler* GetPtrHandler(const void* Ptr) const noexcept { \/\/if(Ptr == nullptr); \/\/check  const size_t LAddr = (const size_t)Ptr; const std::forward_list&lt;FAddrHandler>&amp; LItems = ItemMap[GetLocalAddr(LAddr)]; auto LItemsEnd = LItems.end();  auto LAddrHandler = std::find(LItems.begin(), LItemsEnd, LAddr); if (LAddrHandler == LItemsEnd) return nullptr;  return &amp;LAddrHandler._Ptr->_Myval; }  inline unsigned int GetTotalObjectsCount() const noexcept { return TotalObjectsCount; }  inline unsigned int GetLastGarbagedObjectsCount() const noexcept { return LastGarbagedObjectsCount; }  inline int GetGarbageCollectionIndex() const noexcept { return GarbageCollectionIndex; }  private:  inline unsigned int GetLocalAddr(size_t Addr) const noexcept { return Addr &amp; BitsPackMask; \/\/ Addr % BitsPackSize }    public:  const static unsigned int BitsPackSize = 1048576; \/\/1 MB ~69MB in ram const static int BitsPackMask = 0xfffff; \/\/ 20 bits 2^20 = 1048576  \/\/const static unsigned int BitsPackSize = 65536; \/\/64 KB ~4MB in ram \/\/const static int BitsPackMask = 0xffff; \/\/ 16 bits 2^16 = 65536  private:  std::forward_list&lt;FAddrHandler>* ItemMap = nullptr;  FGarbageListsToClearArray ListsIndexesToClean; TGarbageBoolMask&lt;size_t, BitsPackSize> ListsIndexesToCleanMask;   \/* Total objects count who are under surveillance. *\/ unsigned int TotalObjectsCount = 0; \/* The number of objects destroyed at the last iteration of ClearInvalidPtrs. *\/ unsigned int LastGarbagedObjectsCount = 0; \/* Index of ClearInvalidPtrs iteration. *\/ int GarbageCollectionIndex = 0; };<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0417\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0442\u0438\u043f \u0437\u0430\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0431\u0443\u043b\u043e\u0432 \u0432 TGarbageBoolMask \u0432\u044b\u0431\u0440\u0430\u043d size_t. \u042d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0442\u0438\u043f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e\u0434 \u043a\u0443\u0441\u043e\u0447\u043a\u0438 \u043c\u0430\u0441\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435. \u0410 \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u041c\u0435\u043b\u043e\u0447\u044c, \u0430 \u043f\u0440\u0438\u044f\u0442\u043d\u043e.<\/p>\n<p>\u041d\u0443 \u0438 \u0432\u0438\u0448\u0435\u043d\u043a\u043e\u0439 \u043d\u0430 \u0442\u043e\u0440\u0442\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430. \u0421\u044b\u0433\u0440\u0430\u0435\u043c \u043d\u0430 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043d\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435, \u0430 \u0441\u0430\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 (\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u0434\u043e\u0432 \u043e\u043a\u0443\u043f\u0430\u0435\u0442 \u0438\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c).<\/p>\n<p><strong>\u041c\u0435\u0442\u043e\u0434 ClearInvalidPtrs<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">void ClearInvalidPtrs() { LastGarbagedObjectsCount = 0; if (ListsIndexesToClean.IsEmpty()) return;  ++GarbageCollectionIndex;   if (GarbageCleaningThreadsCount > 1 &amp;&amp; ListsIndexesToClean.Num() > GarbageCleaningThreadsCount) { std::thread* LThreads = new std::thread[GarbageCleaningThreadsCount]; int* LThreadGarabagedObjectsCount = new int[GarbageCleaningThreadsCount];  const int LStep = ListsIndexesToClean.Num() \/ GarbageCleaningThreadsCount + 1; int L = 0; int R = LStep; int LThreadIndex = 0; for (LThreadIndex; LThreadIndex &lt; GarbageCleaningThreadsCount; ++LThreadIndex) { if (R > ListsIndexesToClean.Num()) R = ListsIndexesToClean.Num(); if (L == R) { break; }  LThreads[LThreadIndex] = std::thread([this, L, R, LThreadIndex, LThreadGarabagedObjectsCount]() { int LGarbagedObjectsCount = 0; for (int i = L; i &lt; R; ++i) { ItemMap[ListsIndexesToClean[i]].remove_if([this, &amp;LGarbagedObjectsCount](FAddrHandler&amp; LAddrHandler) { if (!LAddrHandler.IsPendingToKill()) return false;  delete (void*)LAddrHandler.Addr; ++LGarbagedObjectsCount; return true; }); }  LThreadGarabagedObjectsCount[LThreadIndex] = LGarbagedObjectsCount; });  L = R; R += LStep; }  for (int i = 0; i &lt; LThreadIndex; ++i) { LThreads[i].join(); LastGarbagedObjectsCount += LThreadGarabagedObjectsCount[i]; }  ListsIndexesToCleanMask.Clear();  delete[] LThreads; delete[] LThreadGarabagedObjectsCount; } else { for (int i = 0; i &lt; ListsIndexesToClean.Num(); ++i) { ItemMap[ListsIndexesToClean[i]].remove_if([this](FAddrHandler&amp; LAddrHandler) { if (!LAddrHandler.IsPendingToKill()) return false;  delete (void*)LAddrHandler.Addr; ++LastGarbagedObjectsCount; return true; });  ListsIndexesToCleanMask.ClearMaskBit(ListsIndexesToClean[i]); } }  TotalObjectsCount -= LastGarbagedObjectsCount; ListsIndexesToClean.Clear(); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043d\u0435 \u043a\u043e\u043d\u043a\u0443\u0440\u0438\u0440\u0443\u044e\u0442 \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445. <\/p>\n<h2>\u0422\u0435\u0441\u0442\u044b<\/h2>\n<p>\u0417\u0430\u043c\u0435\u0440\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043d\u044b\u0435. \u041b\u0443\u0447\u0448\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0442\u043e\u0436\u0435 \u043e\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b.<\/p>\n<p>\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430: <strong>x86-64<\/strong><br \/>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440: Intel Core i5-11400F<br \/>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430: <strong>Windows 10<br \/><\/strong>\u0421\u0440\u0435\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0437\u0430\u043c\u0435\u0440\u043e\u0432: Visual studio 2022 community<\/p>\n<p>\u0412 \u0442\u0435\u0441\u0442\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"cpp\">struct TestStruct { int A = 5; int B = 3; };<\/code><\/pre>\n<p>\u0412\u044b\u0431\u0440\u0430\u043d \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0442\u0438\u043f.<\/p>\n<p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0442\u0435\u0441\u0442\u0435 = 1 \u043c\u0438\u043b\u043b\u0438\u043e\u043d.<\/p>\n<p><strong>1) \u041f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438<\/strong><\/p>\n<p>\u0421\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442 2 \u0440\u0435\u0436\u0438\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b:<\/p>\n<ol>\n<li>\n<p>\u0421 \u043c\u0435\u043d\u044c\u0448\u0438\u043c\u0438 \u0437\u0430\u0442\u0440\u0430\u0442\u0430\u043c\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u043d\u043e &#171;\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435&#187;.<\/p>\n<\/li>\n<li>\n<p>\u0421 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u043c\u0438 \u0437\u0430\u0442\u0440\u0430\u0442\u0430\u043c\u0438 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438<\/strong> = \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 + \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0432 \u0441\u0431\u043e\u0440\u043a\u0435 * \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043c\u0435\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 + \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 * \u0440\u0430\u0437\u043c\u0435\u0440 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f<\/p>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f(TGCPointer) = 24 \u0431\u0430\u0439\u0442<br \/>\u0420\u0430\u0437\u043c\u0435\u0440 std::shared_ptr = 16 \u0431\u0430\u0439\u0442<br \/>\u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f = 8 \u0431\u0430\u0439\u0442<\/p>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 \u043c\u0435\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438(FAddrHandler) = 16 \u0431\u0430\u0439\u0442<br \/>\u0420\u0430\u0437\u043c\u0435\u0440 \u043c\u0435\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438(std::shared_ptr) = 8 \u0431\u0430\u0439\u0442<br \/>\u0420\u0430\u0437\u043c\u0435\u0440 \u043c\u0435\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438(\u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c) = 0 \u0431\u0430\u0439\u0442<\/p>\n<p>\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043f\u0440\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 65536 ~= 4MB<br \/>\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043f\u0440\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 1048576 ~= 69MB<\/p>\n<p><strong>2) \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/strong><\/p>\n<p>\u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 1 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c.<\/p>\n<p>\u0422\u0435\u0441\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f:<\/p>\n<pre><code class=\"cpp\">TestStruct** Arr = new TestStruct*[IterationsCount]; for (int i = 0; i &lt; IterationsCount; ++i) { Arr[i] = new TestStruct(); }  for (int i = 0; i &lt; IterationsCount; ++i) { delete Arr[i]; }  delete[] Arr;<\/code><\/pre>\n<p>\u0422\u0435\u0441\u0442 std:shared_ptr:<\/p>\n<pre><code class=\"cpp\">for (int i = 0; i &lt; IterationsCount; ++i) { auto A = std::shared_ptr&lt;TestStruct>((new TestStruct())); }<\/code><\/pre>\n<p>\u0422\u0435\u0441\u0442 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430:<\/p>\n<pre><code class=\"cpp\">for (int i = 0; i &lt; IterationsCount; ++i) { TGCPointer&lt;TestStruct> A(new TestStruct(), true); }  GGarbageCollector::Get()->ForceGC();<\/code><\/pre>\n<p>\u0412 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043c\u0443\u0441\u043e\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f 8 \u043f\u043e\u0442\u043e\u043a\u043e\u0432.<br \/>\u0412\u0441\u0435 \u0447\u0438\u0441\u043b\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0432 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445(\u043d\u0443 \u0438 \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u044b \u0432 \u0441\u0438\u043b\u0443 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0438).<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\"><\/p>\n<\/td>\n<td colspan=\"3\" data-colwidth=\"0,96,0\" width=\"0\">\n<p align=\"center\">Development build<\/p>\n<\/td>\n<td colspan=\"3\">\n<p align=\"center\">Release build<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\"><\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<td data-colwidth=\"96\" width=\"96\">\n<p align=\"center\">\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0421\u0443\u043c\u043c\u0430<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0421\u0443\u043c\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">Original<\/p>\n<\/td>\n<td>\n<p align=\"center\">82000<\/p>\n<\/td>\n<td data-colwidth=\"96\" width=\"96\">\n<p align=\"center\">72000<\/p>\n<\/td>\n<td>\n<p align=\"center\">155000<\/p>\n<\/td>\n<td>\n<p align=\"center\">27000<\/p>\n<\/td>\n<td>\n<p align=\"center\">17000<\/p>\n<\/td>\n<td>\n<p align=\"center\">45000<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">std::shared_ptr<\/p>\n<\/td>\n<td>\n<p align=\"center\">?<\/p>\n<\/td>\n<td data-colwidth=\"96\" width=\"96\">\n<p align=\"center\">?<\/p>\n<\/td>\n<td>\n<p align=\"center\">380000<\/p>\n<\/td>\n<td>\n<p align=\"center\">?<\/p>\n<\/td>\n<td>\n<p align=\"center\">?<\/p>\n<\/td>\n<td>\n<p align=\"center\">73000<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">single thread 64KB<\/p>\n<\/td>\n<td>\n<p align=\"center\">390000<\/p>\n<\/td>\n<td data-colwidth=\"96\" width=\"96\">\n<p align=\"center\">280000<\/p>\n<\/td>\n<td>\n<p align=\"center\">670000<\/p>\n<\/td>\n<td>\n<p align=\"center\">60000<\/p>\n<\/td>\n<td>\n<p align=\"center\">80000<\/p>\n<\/td>\n<td>\n<p align=\"center\">140000<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">multi thread 64KB<\/p>\n<\/td>\n<td>\n<p align=\"center\">390000<\/p>\n<\/td>\n<td data-colwidth=\"96\" width=\"96\">\n<p align=\"center\">870000<\/p>\n<\/td>\n<td>\n<p align=\"center\">1,3M<\/p>\n<\/td>\n<td>\n<p align=\"center\">60000<\/p>\n<\/td>\n<td>\n<p align=\"center\">30000<\/p>\n<\/td>\n<td>\n<p align=\"center\">90000<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">single thread 1MB<\/p>\n<\/td>\n<td>\n<p align=\"center\">550000<\/p>\n<\/td>\n<td data-colwidth=\"96\" width=\"96\">\n<p align=\"center\">260000<\/p>\n<\/td>\n<td>\n<p align=\"center\">800000<\/p>\n<\/td>\n<td>\n<p align=\"center\">67000<\/p>\n<\/td>\n<td>\n<p align=\"center\">46000<\/p>\n<\/td>\n<td>\n<p align=\"center\">115000<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">multi thread 1MB<\/p>\n<\/td>\n<td>\n<p align=\"center\">550000<\/p>\n<\/td>\n<td data-colwidth=\"96\" width=\"96\">\n<p align=\"center\">780000<\/p>\n<\/td>\n<td>\n<p align=\"center\">1,3M<\/p>\n<\/td>\n<td>\n<p align=\"center\">67000<\/p>\n<\/td>\n<td>\n<p align=\"center\">18000<\/p>\n<\/td>\n<td>\n<p align=\"center\">85000<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438(\u0434\u043b\u044f Release build)<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><\/p>\n<\/td>\n<td>\n<p align=\"center\">Original<\/p>\n<\/td>\n<td>\n<p align=\"center\">std::shared_ptr<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">single thread 64KB<\/p>\n<\/td>\n<td>\n<p align=\"center\">3,11<\/p>\n<\/td>\n<td>\n<p align=\"center\">1,91<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">multi thread 64KB<\/p>\n<\/td>\n<td>\n<p align=\"center\">2<\/p>\n<\/td>\n<td>\n<p align=\"center\">1,23<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">single thread 1MB<\/p>\n<\/td>\n<td>\n<p align=\"center\">2,56<\/p>\n<\/td>\n<td>\n<p align=\"center\">1,57<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">multi thread 1MB<\/p>\n<\/td>\n<td>\n<p align=\"center\">1,89<\/p>\n<\/td>\n<td>\n<p align=\"center\">1,16<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">std::shared_ptr<\/p>\n<\/td>\n<td>\n<p align=\"center\">1,62<\/p>\n<\/td>\n<td>\n<p align=\"center\">1<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b<\/h2>\n<p>\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0438 \u043c\u0443\u0441\u043e\u0440\u0430 \u0432 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0431\u043b\u0438\u0437\u043a\u0430 \u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u043e\u0447\u0438\u0441\u0442\u043a\u0435 \u043f\u0430\u043c\u044f\u0442\u0438. \u042d\u0442\u043e \u043f\u043e\u0431\u0435\u0434\u0430!<br \/>\u041e\u0431\u0449\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0432 2 \u0440\u0430\u0437\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u043e\u0431\u044a\u0435\u043c \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e.<\/p>\n<p>\u0412 \u0438\u0433\u0440\u0430\u0445 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f (\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c) \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0438 \u0436\u0438\u0432\u0443\u0442 \u0434\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u043e\u0447\u0438\u0441\u0442\u043a\u0443 \u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0447\u0430\u0441\u0442\u043e, \u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u0430\u043a \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438. \u041d\u043e \u043f\u043b\u044e\u0448\u043a\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0441\u043f\u043e\u043a\u043e\u0439\u0441\u0442\u0432\u0438\u0435 \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e \u043f\u0430\u043c\u044f\u0442\u044c \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435 \u0443\u0442\u0435\u0447\u0435\u0442, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0433\u043b\u0430\u0437\u0430 \u043d\u0430 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0441\u0445\u043e\u0434 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u042f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 \u0432\u044b\u0445\u043b\u043e\u043f \u0432 \u0432\u0438\u0434\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 + \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043b\u043e\u044f\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043a\u0443\u0447\u0438 + \u0434\u0440\u0443\u0436\u0435\u043b\u044e\u0431\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 &#8212; \u043e\u043f\u0440\u0430\u0432\u0434\u044b\u0432\u0430\u0435\u0442 \u0441\u0435\u0431\u044f.<\/p>\n<p>\u0418\u043b\u0438 \u043d\u0435\u0442? <\/p>\n<p>\u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430. \u0415\u0433\u043e \u043c\u0435\u0441\u0442\u043e \u0432 \u0433\u0435\u0439\u043c\u043f\u043b\u0435\u0439\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435, \u0433\u0434\u0435 \u0432\u0430\u0436\u043d\u0430 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u043e\u0437\u043d\u0438 \u0441 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e. \u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0449\u0435 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0432 \u043a\u043e\u0440\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u043f\u043e\u0434\u043e\u0439\u0434\u0443\u0442 \u043b\u0438\u0431\u043e &#171;\u0443\u043c\u043d\u044b\u0435&#187; \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438, \u043b\u0438\u0431\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438, \u0431\u0435\u0437 \u043d\u0438\u0445 \u043d\u0438 \u043a\u0443\u0434\u0430.<\/p>\n<p>\u0418 \u0435\u0449\u0435 \u0440\u0430\u0437 \u043e\u0442\u043c\u0435\u0447\u0443. \u0421\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c \u0441 &#171;\u0443\u043c\u043d\u044b\u043c\u0438&#187; \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438. \u0425\u043e\u0442\u044c \u043e\u043d\u0438 \u0438 \u0440\u0435\u0448\u0430\u044e\u0442 \u043e\u0434\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0443, \u043d\u043e &#171;\u0443\u043c\u043d\u044b\u0435&#187; \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043e\u0447\u0438\u0449\u0430\u044e\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u0441\u0438\u044e\u043c\u0438\u043d\u0443\u0442\u043d\u043e, \u043d\u0435 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u044f\u0441\u044c &#171;\u043e\u0431 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0438\u0445&#187;, \u0430 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u043e\u043b\u043e\u0442\u0438\u0442 \u0432 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0443\u0440\u043e\u0432\u043d\u044f).<\/p>\n<h2>\u0427\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c?<\/h2>\n<p>\u0414\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u043e\u0434\u0438\u043d \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043a\u0443\u0441\u043e\u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043e\u0447\u0438\u0449\u0430\u0442\u044c \u0435\u0433\u043e, \u0430  \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u043c. \u0422\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u043e\u0436\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0432 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>P.S. \u0425\u043e\u0442\u044c \u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043a\u0430\u043a \u0441\u043b\u0430\u0431\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438, \u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0443\u043c\u043d\u044b\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \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\/post\/678730\/\"> https:\/\/habr.com\/ru\/post\/678730\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438<\/h2>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0443 \u0434\u043e\u043b\u0433\u043e \u0440\u0430\u0441\u0441\u0443\u0441\u043e\u043b\u0438\u0432\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 \u0438 \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043e\u043d \u043d\u0443\u0436\u0435\u043d (\u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0442\u0430\u0442\u0435\u0439). \u041d\u043e \u0445\u043e\u0447\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u044b\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439.<\/p>\n<ol>\n<li>\n<p>\u0421\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 &#8212; \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 &#171;\u0443\u043c\u043d\u044b\u0445&#187; \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0441++ \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0432\u044b\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0435 \u0432 \u0441\u0430\u043c\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435, \u0430 \u0432 \u043d\u0435\u043a\u043e\u043c \u043e\u0434\u043d\u043e\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435. \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0430 \u0432\u0441\u0435\u0445, \u0438\u043b\u0438 \u043f\u043e\u0440\u0446\u0438\u0438 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 &#8212; \u043d\u0435 \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440. \u0425\u043e\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f\/\u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438\/\u0434\u0435\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043a\u0443\u0447\u0438, \u043d\u043e \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 \u043d\u0435 \u043f\u0440\u0438\u0437\u0432\u0430\u043d \u0435\u0435 \u0440\u0435\u0448\u0430\u0442\u044c. \u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u043e\u043c, \u043d\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0435\u0433\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0430\u043c\u044f\u0442\u044c \u043e\u0447\u0438\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0445\u0430\u043e\u0442\u0438\u0447\u043d\u043e \u0438 \u043d\u0435 &#171;\u043b\u0430\u0432\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e&#187;.<\/p>\n<\/li>\n<\/ol>\n<h2>\u0427\u0442\u043e \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c?<\/h2>\n<p>\u041f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 (\u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0435 \u043f\u0440\u0430\u0432\u0434\u0430 \u043b\u0438?). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 \u0438 \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u0436\u0430\u0442\u044c \u0438\u0437 \u043d\u0435\u0433\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044e \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0438\u043c\u0430 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 c-style \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u044a\u0435\u043c \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0440\u043e\u0431\u043e\u0442\u044b \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u043d\u043e \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0431\u043e\u0440\u0449\u0438\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0440\u0430\u0432\u043d\u0438 &#171;\u0443\u043c\u043d\u044b\u043c&#187; \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0436\u0438\u0437\u043d\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 &#8212; \u043e\u0431\u044a\u0435\u043a\u0442 \u0436\u0438\u0432 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0442\u043e-\u0442\u043e, \u043a\u0442\u043e \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0433\u043e, \u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0418\u0434\u0435\u044f \u0438 \u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435<\/h2>\n<p>\u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 &#171;\u0443\u043c\u043d\u044b\u0445&#187; \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043c \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u043d\u0435\u043a\u0438\u0439 singleton.<\/p>\n<p>\u0414\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043b\u0438\u0446\u0430: <\/p>\n<pre><code class=\"cpp\">template&lt;typename T> struct TGCPointer; \/\/\u043d\u0430\u0448 \u0443\u043c\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c class GGarbageCollector; \/\/ \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430<\/code><\/pre>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u043e\u0434 \u0441\u043b\u0430\u0431\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0448\u0430 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0430 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043b\u0430\u0431\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0441\u0447\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u043c \u043c\u0443\u0441\u043e\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u0443\u043c\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0431\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0441\u043b\u0430\u0431\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0438, \u043b\u0438\u0431\u043e \u0432 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0441 \u0440\u0443\u0447\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<pre><code class=\"cpp\">TGCPointer&lt;int> A; \/\/ \u0441\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 int* B; \/\/\u0441\u043b\u0430\u0431\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430<\/code><\/pre>\n<p><strong>1) \u041d\u0430\u0447\u0430\u043b\u043e<\/strong><\/p>\n<p>\u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<p><strong>GGarbageCollector<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/* Main garbage manager. *\/ class GGarbageCollector {  public:  static inline GGarbageCollector* Get() { static GGarbageCollector GC; return &amp;GC; }  private:  inline GGarbageCollector() {}    public:  \/* Force collect garbage. *\/ inline void ForceGC() {  \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 } \/* @return total objects count who are under surveillance. *\/ inline unsigned int GetTotalObjectsCount() const noexcept { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 } \/* @return the number of objects destroyed at the last iteration of garbage collection. *\/ inline unsigned int GetLastGarbagedObjectsCount() const noexcept { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 } \/* @return index of the garbage collection iteration. *\/ inline unsigned int GetGarbageCollectionIndex() const noexcept { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 }  \/* Check that object address is in GarbageCollector. *\/ inline bool IsGCObjectValid(const void* Object) const noexcept { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 } \/* Check that object address is in GarbageCollector and hasn't got any refs. *\/ inline bool IsGCObjectPendingToKill(const void* Object) const noexcept { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 } };<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u043d\u0430\u0448 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u0443\u043c\u0435\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u0443\u0441\u043e\u0440, \u043d\u043e \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430. \u0410\u0434\u0440\u0435\u0441 &#8212; \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043e\u0431 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435, \u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0442\u043e\u0442 \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u0431\u044b\u043b \u0432\u0438\u0434\u0435\u043d \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0443, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435.  <\/p>\n<p><strong>TGCPointer<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">template&lt;typename T> struct TGCPointer {  public:  inline TGCPointer() {} inline TGCPointer(T* InObject) : Object(InObject) { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 } inline TGCPointer(T* InObject, bool IsNew) : Object(InObject) { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 } inline TGCPointer(const TGCPointer&amp; OtherGCPointer) : Object(OtherGCPointer.Object) { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 } inline TGCPointer(TGCPointer&amp;&amp; OtherGCPointer) noexcept : Object(OtherGCPointer.Object) { OtherGCPointer.Object = nullptr; }  ~TGCPointer() { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 }  public:  operator bool() { return IsValid(); }  operator T*() { return Object; }  inline T&amp; operator*() const { return *Object; }  inline T* operator->() const { return Object; }  inline TGCPointer&amp; operator=(const TGCPointer&amp; InGCPointer) { if (InGCPointer.Object == Object) return *this;  \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435  return *this; } inline TGCPointer&amp; operator=(TGCPointer&amp;&amp; InGCPointer) { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435  return *this; } inline TGCPointer&amp; operator=(T* Ptr) { if (Ptr == Object) return *this;  \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435  return *this; }    \/\/ \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0443\u0441\u0442\u0438\u043b, \u043e\u043d\u0438 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b   public:  inline bool IsValid() const noexcept { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 }  inline T* Get() const noexcept { return Object; }  inline T* GetChecked() const noexcept { if (!IsValid()) { Object = nullptr; } return Object; }  inline void Reset() { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 Object = nullptr; }    private:  \/* Owned object. *\/ T* Object = nullptr; };   template&lt;typename T, typename... Args> TGCPointer&lt;T> MakeGCPointer(...) { return TGCPointer&lt;T>(new T(Args...)); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0417\u0434\u0435\u0441\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f. \u041d\u0430\u0448 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u043e\u0439 \u043d\u0430\u0434 \u0441\u0438\u0448\u043d\u044b\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c, \u043d\u043e \u0443\u043c\u0435\u0435\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 (\u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430). \u0421\u043b\u0430\u0431\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u0432 \u0432\u0438\u0434\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430.<\/p>\n<p>\u0418\u0437 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u043e \u0432\u0438\u0434\u043d\u0430 \u043c\u0435\u0447\u0442\u0430 &#8212; \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043e \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u043a\u0430\u043a \u0447\u0438\u0441\u043b\u0430.<\/p>\n<p><strong>2) \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/strong><\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0447\u0442\u043e-\u0442\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430, \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043c\u0435\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0435\u043c. \u0412 \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c <em>TGCPointer, <\/em>\u043d\u043e \u043a\u0430\u043a \u0435\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c? <\/p>\n<p>\u0414\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043d\u0430\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043e\u0434\u043d\u043e\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a. \u041d\u043e \u043a\u0430\u043a \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u044f? \u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u044d\u0442\u0438\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c. \u041d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a. \u0417\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\u044e. \u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u043e\u0434\u043d\u043e\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a. \u0422\u0430\u043a \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u0430 const + \u0447\u0438\u0441\u043b\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 * \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u043e\u0431\u044a\u0435\u043a\u0442\u0435.<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0435 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430, \u0430 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c \u043d\u0435\u043a\u043e\u0439 \u0435\u0433\u043e \u0447\u0430\u0441\u0442\u0438. \u0425\u043e\u0442\u044c \u043c\u044b \u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043b\u0443\u0447\u0448\u0435 \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u043a\u0443 (\u0432\u0441\u0435 \u0435\u0449\u0435 O(n)), \u043d\u043e \u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 (2^k). \u042d\u0442\u0443 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0439(65536 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e 64 KB \u0438\u043b\u0438 1048576, \u0447\u0442\u043e \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e 1 MB) \u041f\u043e \u0437\u0430\u043c\u0435\u0440\u0430\u043c (\u043e \u043d\u0438\u0445 \u0432 \u043a\u043e\u043d\u0446\u0435), \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u0440\u043e\u0441\u0442\u0430 \u043d\u0435 \u0434\u0430\u044e\u0442. \u0422\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043d\u0430\u0448 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u0435\u043d\u0435\u0435 \u0441 \u0447\u0435\u043c 2-3 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043d\u043e \u0434\u043b\u044f \u0438\u0433\u0440 \u044d\u0442\u043e\u0433\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e + \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e (\u043d\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e) \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043e\u0447\u0438\u0441\u0442\u043a\u0443.<\/p>\n<p>\u042d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c, \u0434\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f.<\/p>\n<p><strong>3) \u041e\u0431\u043c\u0430\u0436\u0435\u043c\u0441\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f\u043c\u0438<\/strong><\/p>\n<p><strong>FAddrHandler<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/* Helper struct to handle object references. *\/ struct FAddrHandler {  public:  inline FAddrHandler() noexcept { } inline FAddrHandler(size_t InAddr, unsigned int InCount) noexcept : Addr(InAddr), Count(InCount) { } inline FAddrHandler(size_t InAddr) noexcept : Addr(InAddr) { } inline FAddrHandler(const void* Ptr, unsigned int InCount) noexcept : Addr((size_t)Ptr), Count(InCount) { } inline FAddrHandler(const void* Ptr) noexcept : Addr((size_t)Ptr) { }   public:  \/* Check that this handler represent any object. *\/ inline bool IsValid() const noexcept { return Addr != 0; } \/* Check that this object is a candidate to killing by any Garbage Collector. @return true if this handler has object, but it has no references. *\/ inline bool IsPendingToKill() const noexcept { return Count == 0 &amp;&amp; Addr != 0; }   public:  \/* Object's memory address in integral type. *\/ size_t Addr = 0; \/* Number of references to an object in the program. *\/ unsigned int Count = 0; };  \/\/ \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0443\u0441\u0442\u0438\u043b, \u043e\u043d\u0438 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0443\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e. \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 \u0441\u0441\u044b\u043b\u043e\u043a.<\/p>\n<p><strong>FAnyPtrMap<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/* Helper struct for manage AddrHandlers. @see FAddrHandler. *\/ struct FAnyPtrMap {  public:  inline FAnyPtrMap() : { ItemMap = new std::forward_list&lt;FAddrHandler>[BitsPackSize]; }  ~FAnyPtrMap() { if (ItemMap != nullptr) delete[] ItemMap; }    public:  FAddrHandler* AddPtr(const void* Ptr) { \/\/if (Ptr == nullptr) return; \/\/check  const size_t LAddr = (const size_t)Ptr;  std::forward_list&lt;FAddrHandler>&amp; LItems = ItemMap[GetLocalAddr(LAddr)]; auto LItemsEnd = LItems.end();  auto LAddrHandler = std::find(LItems.begin(), LItemsEnd, LAddr); if (LAddrHandler != LItemsEnd) { ++LAddrHandler->Count; return &amp;LAddrHandler._Ptr->_Myval; } else { ++TotalObjectsCount; LItems.push_front(FAddrHandler(LAddr, 1)); return &amp;LItems.front(); } }  FAddrHandler* AddNewPtr(const void* Ptr) { \/\/if (Ptr == nullptr) return; \/\/check  const size_t LAddr = (const size_t)Ptr;  std::forward_list&lt;FAddrHandler>&amp; LItems = ItemMap[GetLocalAddr(LAddr)];  ++TotalObjectsCount; LItems.push_front(FAddrHandler(LAddr, 1)); return &amp;LItems.front(); }  FAddrHandler* RemovePtr(const void* Ptr) { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 }  inline void RemovePtrByHandler(FAddrHandler* PtrHandler) { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 }  void ClearInvalidPtrs() { \/\/TODO, \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 }    FAddrHandler* GetPtrHandler(const void* Ptr) const noexcept { \/\/if(Ptr == nullptr); \/\/check  const size_t LAddr = (const size_t)Ptr; const std::forward_list&lt;FAddrHandler>&amp; LItems = ItemMap[GetLocalAddr(LAddr)]; auto LItemsEnd = LItems.end();  auto LAddrHandler = std::find(LItems.begin(), LItemsEnd, LAddr); if (LAddrHandler == LItemsEnd) return nullptr;  return &amp;LAddrHandler._Ptr->_Myval; }  inline unsigned int GetTotalObjectsCount() const noexcept { return TotalObjectsCount; }  inline unsigned int GetLastGarbagedObjectsCount() const noexcept { return LastGarbagedObjectsCount; }  inline int GetGarbageCollectionIndex() const noexcept { return GarbageCollectionIndex; }   private:  inline unsigned int GetLocalAddr(size_t Addr) const<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-336114","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/336114","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=336114"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/336114\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=336114"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=336114"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=336114"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}