{"id":619,"date":"2025-01-14T11:31:00","date_gmt":"2025-01-14T14:31:00","guid":{"rendered":"https:\/\/suspensao.blog.br\/descrenca\/?p=619"},"modified":"2025-03-17T18:19:43","modified_gmt":"2025-03-17T21:19:43","slug":"implementando-malloc-e-free-juntando-blocos-pequenos","status":"publish","type":"post","link":"https:\/\/suspensao.blog.br\/descrenca\/implementando-malloc-e-free-juntando-blocos-pequenos\/","title":{"rendered":"Implementando malloc() e free() \u2014 juntando blocos pequenos"},"content":{"rendered":"\n<p>No <a href=\"https:\/\/suspensao.blog.br\/descrenca\/implementando-malloc-e-free-dividindo-blocos-grandes\/\"><em>post<\/em> anterior<\/a>, aprendemos como dividir blocos para aproveitar melhor os espa\u00e7os grandes. Contudo, isso traz um novo desafio: a fragmenta\u00e7\u00e3o da mem\u00f3ria. Blocos ores podem se acumular, formando cadeias de blocos livres que, se unificados, atenderiam a requisi\u00e7\u00f5es maiores. \u00c0 medida que os blocos s\u00e3o divididos, tornam-se cada vez menores, dificultando seu reaproveitamento.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Como blocos pequenos podem aumentar o consumo de mem\u00f3ria<\/h2>\n\n\n\n<p>Considere, por exemplo, o <em>snippet<\/em> de c\u00f3digo abaixo:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">void<\/span> *ptr1 = abmalloc(<span class=\"hljs-number\">128<\/span>);\n<span class=\"hljs-keyword\">void<\/span> *ptr2 = abmalloc(<span class=\"hljs-number\">8<\/span>);\nabfree(ptr1);\n<span class=\"hljs-keyword\">void<\/span> *ptr3 = abmalloc(<span class=\"hljs-number\">8<\/span>);\nabfree(ptr3);\n<span class=\"hljs-keyword\">void<\/span> *ptr4 = abmalloc(<span class=\"hljs-number\">128<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Nele, alocamos 128 bytes de mem\u00f3ria e, posteriormente, 8 bytes. Os blocos de mem\u00f3ria teriam um <em>layout<\/em> similar \u00e0 figura abaixo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-ocupado-bloco-pequeno-ocupado.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"707\" height=\"45\" data-attachment-id=\"680\" data-permalink=\"https:\/\/suspensao.blog.br\/descrenca\/implementando-malloc-e-free-juntando-blocos-pequenos\/bloco-grande-ocupado-bloco-pequeno-ocupado\/\" data-orig-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-ocupado-bloco-pequeno-ocupado.png?fit=707%2C45&amp;ssl=1\" data-orig-size=\"707,45\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"bloco-grande-ocupado-bloco-pequeno-ocupado\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-ocupado-bloco-pequeno-ocupado.png?fit=300%2C19&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-ocupado-bloco-pequeno-ocupado.png?fit=707%2C45&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-ocupado-bloco-pequeno-ocupado.png?resize=707%2C45&#038;ssl=1\" alt=\"Diagrama mostrando o resultado das opera\u00e7\u00f5es de aloca\u00e7\u00e3o - um bloco de mem\u00f3ria largo e em uso, seguido de um pequeno tamb\u00e9m em uso\" class=\"wp-image-680\" srcset=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-ocupado-bloco-pequeno-ocupado.png?w=707&amp;ssl=1 707w, https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-ocupado-bloco-pequeno-ocupado.png?resize=300%2C19&amp;ssl=1 300w\" sizes=\"auto, (max-width: 707px) 100vw, 707px\" \/><\/a><\/figure>\n\n\n\n<p>Depois, liberamos o bloco maior:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-ocupado.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"707\" height=\"45\" data-attachment-id=\"681\" data-permalink=\"https:\/\/suspensao.blog.br\/descrenca\/implementando-malloc-e-free-juntando-blocos-pequenos\/bloco-grande-livre-bloco-pequeno-ocupado\/\" data-orig-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-ocupado.png?fit=707%2C45&amp;ssl=1\" data-orig-size=\"707,45\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"bloco-grande-livre-bloco-pequeno-ocupado\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-ocupado.png?fit=300%2C19&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-ocupado.png?fit=707%2C45&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-ocupado.png?resize=707%2C45&#038;ssl=1\" alt=\"Diagrama mostrando o resultado da primeira chamada de abfree() - um bloco de mem\u00f3ria largo e livre para ser reutilizado, seguido de um pequeno ainda ocupado\" class=\"wp-image-681\" srcset=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-ocupado.png?w=707&amp;ssl=1 707w, https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-ocupado.png?resize=300%2C19&amp;ssl=1 300w\" sizes=\"auto, (max-width: 707px) 100vw, 707px\" \/><\/a><\/figure>\n\n\n\n<p>&#8230;e alocamos 8 bytes. Devido \u00e0s <a href=\"https:\/\/suspensao.blog.br\/descrenca\/implementando-malloc-e-free-dividindo-blocos-grandes\/\">\u00faltimas mudan\u00e7as na fun\u00e7\u00e3o <code>abmalloc()<\/code><\/a>, esses 8 bytes ser\u00e3o extra\u00eddos do bloco maior:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-ocupado-bloco-pequeno-ocupado.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"707\" height=\"45\" data-attachment-id=\"682\" data-permalink=\"https:\/\/suspensao.blog.br\/descrenca\/implementando-malloc-e-free-juntando-blocos-pequenos\/bloco-grande-livre-bloco-pequeno-ocupado-bloco-pequeno-ocupado\/\" data-orig-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-ocupado-bloco-pequeno-ocupado.png?fit=707%2C45&amp;ssl=1\" data-orig-size=\"707,45\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"bloco-grande-livre-bloco-pequeno-ocupado-bloco-pequeno-ocupado\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-ocupado-bloco-pequeno-ocupado.png?fit=300%2C19&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-ocupado-bloco-pequeno-ocupado.png?fit=707%2C45&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-ocupado-bloco-pequeno-ocupado.png?resize=707%2C45&#038;ssl=1\" alt=\"Diagrama mostrando o resultado das opera\u00e7\u00f5es de aloca\u00e7\u00e3o ap\u00f3s liberar 128 bytes - um bloco de mem\u00f3ria largo e livre, seguido dois blocos pequenos tamb\u00e9m em uso\" class=\"wp-image-682\" srcset=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-ocupado-bloco-pequeno-ocupado.png?w=707&amp;ssl=1 707w, https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-ocupado-bloco-pequeno-ocupado.png?resize=300%2C19&amp;ssl=1 300w\" sizes=\"auto, (max-width: 707px) 100vw, 707px\" \/><\/a><\/figure>\n\n\n\n<p>Agora, ao liberar os 8 bytes rec\u00e9m-alocados, obtivemos dois blocos livres:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"707\" height=\"45\" data-attachment-id=\"683\" data-permalink=\"https:\/\/suspensao.blog.br\/descrenca\/implementando-malloc-e-free-juntando-blocos-pequenos\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado\/\" data-orig-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado.png?fit=707%2C45&amp;ssl=1\" data-orig-size=\"707,45\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado.png?fit=300%2C19&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado.png?fit=707%2C45&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado.png?resize=707%2C45&#038;ssl=1\" alt=\"Diagrama mostrando mm bloco de mem\u00f3ria largo e livre, seguido de um bloco pequeno livre e um bloco pequeno em uso\" class=\"wp-image-683\" srcset=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado.png?w=707&amp;ssl=1 707w, https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado.png?resize=300%2C19&amp;ssl=1 300w\" sizes=\"auto, (max-width: 707px) 100vw, 707px\" \/><\/a><\/figure>\n\n\n\n<p>Quando alocamos um novo bloco de 128 bytes, enfrentamos um problema: nenhum dos dois blocos livres possui tamanho suficiente individualmente, embora, juntos, eles pudessem atender \u00e0 requisi\u00e7\u00e3o. Como resultado, um novo bloco \u00e9 alocado no final da <em>stack<\/em>, que continua a crescer.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado-bloco-grande-ocupado.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"39\" data-attachment-id=\"684\" data-permalink=\"https:\/\/suspensao.blog.br\/descrenca\/implementando-malloc-e-free-juntando-blocos-pequenos\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado-bloco-grande-ocupado\/\" data-orig-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado-bloco-grande-ocupado.png?fit=1271%2C48&amp;ssl=1\" data-orig-size=\"1271,48\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado-bloco-grande-ocupado\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado-bloco-grande-ocupado.png?fit=300%2C11&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado-bloco-grande-ocupado.png?fit=1024%2C39&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado-bloco-grande-ocupado.png?resize=1024%2C39&#038;ssl=1\" alt=\"Um bloco de mem\u00f3ria largo e livre, um bloco pequeno e livre, um bloco pequeno ocupado e um bloco grande ocupado. Se o bloco menor que est\u00e1 livre agora n\u00e3o tivesse sido extra\u00eddo do maior, poder\u00edamos ter aproveitado o bloco maior livre.\" class=\"wp-image-684\" srcset=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado-bloco-grande-ocupado.png?resize=1024%2C39&amp;ssl=1 1024w, https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado-bloco-grande-ocupado.png?resize=300%2C11&amp;ssl=1 300w, https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado-bloco-grande-ocupado.png?resize=768%2C29&amp;ssl=1 768w, https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2025\/01\/bloco-grande-livre-bloco-pequeno-livre-bloco-pequeno-ocupado-bloco-grande-ocupado.png?w=1271&amp;ssl=1 1271w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/a><\/figure>\n\n\n\n<p>Uma solu\u00e7\u00e3o para esse problema \u00e9 unir blocos livres adjacentes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Refatorando para reuso e legibilidade<\/h2>\n\n\n\n<p>Antes de prosseguirmos, faremos mais uma rodada de refatora\u00e7\u00f5es, pois h\u00e1 trechos de c\u00f3digo pequenos, mas complexos, que ser\u00e3o reutilizados.<\/p>\n\n\n\n<p>Primeiramente, vamos criar uma fun\u00e7\u00e3o que, ao receber um <em>header<\/em>, retorne um ponteiro para a \u00e1rea de mem\u00f3ria a ser devolvida ao usu\u00e1rio. At\u00e9 agora, temos obtido esse resultado somando uma unidade ao ponteiro do <em>header<\/em>. Vamos encapsular essa l\u00f3gica em uma fun\u00e7\u00e3o para simplificar e melhorar a reutiliza\u00e7\u00e3o do c\u00f3digo:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">void<\/span> *header_user_area(Header *header) {\n  <span class=\"hljs-keyword\">return<\/span> header + <span class=\"hljs-number\">1<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Consequentemente, em todos os lugares de <code>abmalloc()<\/code> onde anteriormente utiliz\u00e1vamos:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">return<\/span> header + <span class=\"hljs-number\">1<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>&#8230;vamos utilizar a nova fun\u00e7\u00e3o:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">return header_user_area(first);<\/pre>\n\n\n\n<p>Tamb\u00e9m precisamos frequentemente do ponteiro para a posi\u00e7\u00e3o de mem\u00f3ria ap\u00f3s o bloco. Atualmente, calculamos isso com uma f\u00f3rmula um tanto complicada: fazemos o casting do ponteiro do header para <code>void*<\/code>, somamos o tamanho da estrutura <code>Header<\/code> e adicionamos o tamanho do bloco alocado. Essa l\u00f3gica pode ser observada na fun\u00e7\u00e3o <code>header_split()<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">    Header *new_header = ((<span class=\"hljs-keyword\">void<\/span>*)header) + sizeof(Header) + header-&gt;size;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Vamos criar uma fun\u00e7\u00e3o para executar esta opera\u00e7\u00e3o, chamada <code>header_address_after_block()<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">void<\/span> *header_address_after_block(Header *header) {\n  <span class=\"hljs-keyword\">return<\/span> ((<span class=\"hljs-keyword\">void<\/span>*)header) + sizeof(Header) + header-&gt;size;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Como a fun\u00e7\u00e3o <code>header_user_area()<\/code> j\u00e1 realiza basicamente a mesma opera\u00e7\u00e3o que a primeira parte da f\u00f3rmula, podemos utiliz\u00e1-la para simplificar <code>header_split()<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">void<\/span> *header_address_after_block(Header *header) {\n  <span class=\"hljs-keyword\">return<\/span> header_user_area(header) + header-&gt;size;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Depois disso, substituiremos a f\u00f3rmula pela nossa fun\u00e7\u00e3o em <code>header_split()<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">    Header *new_header = header_address_after_block(header);<\/code><\/span><\/pre>\n\n\n<p>Por fim, ser\u00e1 necess\u00e1rio verificar se, dado um <code>header<\/code>, existe um bloco livre antes ou depois dele. A express\u00e3o para essa verifica\u00e7\u00e3o \u00e9 intuitiva, mas extensa. Por exemplo, a f\u00f3rmula abaixo \u00e9 usada para determinar se h\u00e1 um bloco livre antes:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">(header-&gt;previous != <span class=\"hljs-keyword\">NULL<\/span>) &amp;&amp; header-&gt;previous-&gt;available<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Para facilitar um pouco a leitura, vamos colocar essa express\u00e3o em uma fun\u00e7\u00e3o, assim como a outra, correspondente a blocos posteriores:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">bool header_previous_available(Header *header) {\n  <span class=\"hljs-keyword\">return<\/span> (header-&gt;previous != <span class=\"hljs-keyword\">NULL<\/span>) &amp;&amp; header-&gt;previous-&gt;available;\n}\n\nbool header_next_available(Header *header) {\n  <span class=\"hljs-keyword\">return<\/span> (header-&gt;next != <span class=\"hljs-keyword\">NULL<\/span>) &amp;&amp; header-&gt;next-&gt;available;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Pronto, agora temos quatro novas ferramentas que ir\u00e3o nos ajudar a fundir blocos dispon\u00edveis. Vamos em frente!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Procurando blocos livres adjacentes<\/h2>\n\n\n\n<p>Para juntar blocos de mem\u00f3ria livres e adjacentes, precisamos, no momento da desaloca\u00e7\u00e3o, verificar se o bloco anterior ou o bloco posterior est\u00e3o dispon\u00edveis. Podemos fazer isso criando duas vari\u00e1veis: uma para apontar para o primeiro bloco livre e outra para o \u00faltimo bloco livre. Inicialmente, ambas apontar\u00e3o para o bloco que est\u00e1 sendo desalocado.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Header *header_merge(Header *header) {\n  Header *first_available = header;\n  Header *last_available = header;<\/code><\/span><\/pre>\n\n\n<p>Se o bloco anterior ao atual estiver livre,  <code>first_available<\/code> aponta para ele.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">   <span class=\"hljs-keyword\">if<\/span> (header_previous_available(header)) {\n     first_available = header-&gt;previous;\n   }<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>De modo an\u00e1logo, se o pr\u00f3ximo bloco estiver dispon\u00edvel, <code>last_available<\/code> deve apontar para ele<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">  <span class=\"hljs-keyword\">if<\/span> (header_next_available(header)) {\n    last_available = header-&gt;next;\n  }<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Quando n\u00e3o h\u00e1 blocos livres<\/h3>\n\n\n\n<p>Caso n\u00e3o haja blocos livres nem \u00e0 frente nem antes do bloco rec\u00e9m-desalocado, n\u00e3o h\u00e1 nada a ser fundido. Neste caso, as vari\u00e1veis <code>first_available<\/code> e <code>last_available<\/code> ser\u00e3o iguais a <code>header<\/code>, e nossa fun\u00e7\u00e3o simplesmente retornar\u00e1 o ponteiro para o bloco que foi passado a ela.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">  <span class=\"hljs-keyword\">if<\/span> ((first_available == header) &amp;&amp; (last_available == header)) {\n    <span class=\"hljs-keyword\">return<\/span> header;\n  }<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Nota:<\/strong> N\u00e3o precisamos verificar o bloco anterior ao anterior, ou o posterior ao posterior, e assim por diante. Se, em cada chamada de <code>abfree()<\/code>, fundimos o bloco com qualquer vizinho livre, \u00e9 imposs\u00edvel ter dois blocos livres consecutivos. Portanto, basta verificar apenas os vizinhos imediatos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Atualizando o tamanho quando h\u00e1 blocos livres<\/h3>\n\n\n\n<p>Caso alguma das vari\u00e1veis <code>first_available<\/code> ou <code>last_available<\/code> n\u00e3o seja igual a <code>header<\/code>, precisaremos fundir os blocos. Para isso, precisamos realizar duas a\u00e7\u00f5es.<\/p>\n\n\n\n<p>Primeiro, devemos atualizar o tamanho do primeiro bloco dispon\u00edvel para incluir o \u00faltimo bloco. Para isso, obtemos o ponteiro que aponta logo ap\u00f3s o \u00faltimo bloco dispon\u00edvel.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">  <span class=\"hljs-keyword\">void<\/span> *end = header_address_after_block(last_available);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>O tamanho do novo bloco ser\u00e1 a diferen\u00e7a entre este ponteiro e o endere\u00e7o do bloco de usu\u00e1rio:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">  size_t size = end - header_user_area(first_available);E<\/code><\/span><\/pre>\n\n\n<p>Uma vez que tenhamos o tamanho, s\u00f3 precisamos atualizar o primeiro bloco dispon\u00edvel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">  header_init(first_available, size, <span class=\"hljs-literal\">true<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Atualizando ponteiros do bloco fundido<\/h3>\n\n\n\n<p>Com o tamanho do bloco atualizado, precisamos ajustar seus ponteiros. Para o ponteiro para tr\u00e1s, ele deve passar a apontar para o bloco anterior ao primeiro bloco dispon\u00edvel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">  Header *previous = first_available-&gt;previous;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>J\u00e1 o pr\u00f3ximo deve ser o que se seguia ao \u00faltimo bloco dispon\u00edvel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">  Header *next = last_available-&gt;next;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Uma vez que tenhamos esses valores, basta conect\u00e1-los adequadamente utilizando a fun\u00e7\u00e3o <code>header_plug()<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">  header_plug(first_available, previous, next);<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Caso de borda: o \u00faltimo bloco<\/h3>\n\n\n\n<p>Um \u00faltimo cuidado que devemos ter \u00e9 considerar que o novo bloco pode vir a ser o \u00faltimo. Neste caso, o bloco que criamos deve se tornar o \u00faltimo bloco agora.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">  <span class=\"hljs-keyword\">if<\/span> (last_available == last) {\n    last = first_available;\n  }\n  <span class=\"hljs-keyword\">return<\/span> first_available;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Com isso, nossa fun\u00e7\u00e3o de fus\u00e3o est\u00e1 implementada.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Utilizando <code>header_merge()<\/code> em <code>abfree()<\/code><\/h2>\n\n\n\n<p>Agora que temos uma fun\u00e7\u00e3o que une blocos livres, alteramos <code>abfree()<\/code> para invoc\u00e1-la no <em>header<\/em> do bloco a ser desalocado. Feito isso, prosseguimos com a libera\u00e7\u00e3o de mem\u00f3ria<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">  Header *header = (Header*) ptr - 1;\n  header = header_merge(header);\n\n  if (header == last) {<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>Aqui est\u00e1 a fun\u00e7\u00e3o <code>abfree()<\/code> completa:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">void abfree(void *ptr) {\n  <span class=\"hljs-keyword\">if<\/span> (ptr == <span class=\"hljs-keyword\">NULL<\/span>) {\n    <span class=\"hljs-keyword\">return<\/span>;\n  }\n  Header *header = (Header*) ptr - <span class=\"hljs-number\">1<\/span>;\n\n  header = header_merge(header);\n\n  <span class=\"hljs-keyword\">if<\/span> (header == last) {\n    <span class=\"hljs-keyword\">while<\/span> (header_previous_available(header)) {\n      header = header-&gt;previous;\n    }\n    last = header-&gt;previous;\n    <span class=\"hljs-keyword\">if<\/span> (last != <span class=\"hljs-keyword\">NULL<\/span>) {\n      last-&gt;next = <span class=\"hljs-keyword\">NULL<\/span>;\n    } <span class=\"hljs-keyword\">else<\/span> {\n      first = <span class=\"hljs-keyword\">NULL<\/span>;\n    }\n    brk(header);\n  } <span class=\"hljs-keyword\">else<\/span> {\n    header-&gt;available = <span class=\"hljs-keyword\">true<\/span>;\n  }\n}\n\nHeader *header_new(Header *previous, size_t size, bool available) {\n  Header *header = sbrk(sizeof(Header) + size);\n  header_init(header, size, available);\n  header_plug(header, previous, <span class=\"hljs-keyword\">NULL<\/span>);\n  <span class=\"hljs-keyword\">return<\/span> header;\n}\n\nvoid header_init( Header *header, size_t size, bool available) {\n  header-&gt;size = size;\n  header-&gt;available = available;\n}\n\nvoid header_plug(Header *header, Header *previous, Header *next) {\n  header-&gt;previous = previous;\n  <span class=\"hljs-keyword\">if<\/span> (previous != <span class=\"hljs-keyword\">NULL<\/span>) {\n    previous-&gt;next = header;\n  }\n  header-&gt;next = next;\n  <span class=\"hljs-keyword\">if<\/span> (next != <span class=\"hljs-keyword\">NULL<\/span>) {\n    next-&gt;previous = header;\n  }\n}\n\nvoid *header_user_area(Header *header) {\n  <span class=\"hljs-keyword\">return<\/span> header + <span class=\"hljs-number\">1<\/span>;\n}\n\nvoid *header_address_after_block(Header *header) {\n  <span class=\"hljs-keyword\">return<\/span> header_user_area(header) + header-&gt;size;\n}\n\nbool header_previous_available(Header *header) {\n  <span class=\"hljs-keyword\">return<\/span> (header-&gt;previous != <span class=\"hljs-keyword\">NULL<\/span>) &amp;&amp; header-&gt;previous-&gt;available;\n}\n\nbool header_next_available(Header *header) {\n  <span class=\"hljs-keyword\">return<\/span> (header-&gt;next != <span class=\"hljs-keyword\">NULL<\/span>) &amp;&amp; header-&gt;next-&gt;available;\n}\n\nHeader *header_merge(Header *header) {\n  Header *first_available = header;\n  Header *last_available = header;\n\n  <span class=\"hljs-keyword\">if<\/span> (header_previous_available(header)) {\n    first_available = header-&gt;previous;\n  }\n  <span class=\"hljs-keyword\">if<\/span> (header_next_available(header)) {\n    last_available = header-&gt;next;\n  }\n\n  <span class=\"hljs-keyword\">if<\/span> ((first_available == header) &amp;&amp; (last_available == header)) {\n    <span class=\"hljs-keyword\">return<\/span> header;\n  }\n\n  void *end = header_address_after_block(last_available);\n  size_t size = end - header_user_area(first_available);\n  header_init(first_available, size, <span class=\"hljs-keyword\">true<\/span>);\n\n  Header *previous = first_available-&gt;previous;\n  Header *next = last_available-&gt;next;\n  header_plug(first_available, previous, next);\n\n  <span class=\"hljs-keyword\">if<\/span> (last_available == last) {\n    last = first_available;\n  }\n\n  <span class=\"hljs-keyword\">return<\/span> first_available;\n}\n\nHeader *header_split(Header *header, size_t size) {\n  size_t original_size = header-&gt;size;\n  <span class=\"hljs-keyword\">if<\/span> (original_size &gt; size + sizeof(Header)) {\n    header-&gt;size = original_size - size - sizeof(Header);\n    Header *new_header = header_address_after_block(header);\n    header_init(new_header, size, <span class=\"hljs-keyword\">true<\/span>);\n    header_plug(new_header, header, header-&gt;next);\n    <span class=\"hljs-keyword\">if<\/span> (header == last) {\n      last = new_header;\n    }\n    <span class=\"hljs-keyword\">return<\/span> new_header;\n  } <span class=\"hljs-keyword\">else<\/span> {\n    <span class=\"hljs-keyword\">return<\/span> header;\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Com as altera\u00e7\u00f5es deste e do \u00faltimo <em>post<\/em>, o tamanho dos blocos livres deixam de ser um agravante no consumo de mem\u00f3ria, e nossa fun\u00e7\u00e3o <code>malloc()<\/code> aproxima-se de ficar pronta. H\u00e1 por\u00e9m, um \u00faltimo problema a ser resolvido: o alinhamento de blocos de mem\u00f3ria. Examinaremos isto no <a href=\"https:\/\/suspensao.blog.br\/descrenca\/implementando-malloc-e-free-alinhamento-de-memoria\/\">pr\u00f3ximo <em>post<\/em><\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>No post anterior, aprendemos como dividir blocos para aproveitar melhor os espa\u00e7os grandes. Contudo, isso traz um novo desafio: a fragmenta\u00e7\u00e3o da mem\u00f3ria. Blocos ores podem se acumular, formando cadeias de blocos livres que, se unificados, atenderiam a requisi\u00e7\u00f5es maiores. \u00c0 medida que os blocos s\u00e3o divididos, tornam-se cada vez menores, dificultando seu reaproveitamento. Como [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[29,179,10,1],"tags":[],"class_list":["post-619","post","type-post","status-publish","format-standard","hentry","category-c","category-libc","category-linux","category-uncategorized"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p23QLV-9Z","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/posts\/619","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/comments?post=619"}],"version-history":[{"count":7,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/posts\/619\/revisions"}],"predecessor-version":[{"id":699,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/posts\/619\/revisions\/699"}],"wp:attachment":[{"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/media?parent=619"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/categories?post=619"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/tags?post=619"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}