﻿
{"id":6360,"date":"2017-05-23T16:31:49","date_gmt":"2017-05-23T16:31:49","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=6360"},"modified":"2017-05-23T16:31:49","modified_gmt":"2017-05-23T16:31:49","slug":"cta-gostericipointer-stackalloc-anahtar-sozcugu-ix","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/cta-gostericipointer-stackalloc-anahtar-sozcugu-ix\/","title":{"rendered":"C#\u2019ta G\u00f6sterici(Pointer) \u2013 stackalloc Anahtar S\u00f6zc\u00fc\u011f\u00fc \u2013 IX"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bir \u00f6nceki C#\u2019ta <a href=\"http:\/\/www.gencayyildiz.com\/blog\/cta-gostericipointer-gostericiler-ile-dizi-islemleri-viii\/\" target=\"_blank\">G\u00f6sterici(Pointer) \u2013 G\u00f6stericiler \u0130le Dizi \u0130\u015flemleri \u2013 VIII<\/a> ba\u015fl\u0131kl\u0131 makalemizde g\u00f6stericiler ile dizi i\u015flemlerini fixed keyword\u00fc ile ele alm\u0131\u015ft\u0131k. Bu i\u00e7eri\u011fimizde ise \u00f6nceki makalemizle i\u00e7erik a\u00e7\u0131s\u0131ndan paralel do\u011frultuda olan ama yap\u0131sal ve yakla\u015f\u0131m olarak olduk\u00e7a farkl\u0131l\u0131k arz eden stackalloc anahtar s\u00f6zc\u00fc\u011f\u00fc \u00fczerine konu\u015fuyor olaca\u011f\u0131z.<\/p>\n<h4>stackalloc Anahtar S\u00f6zc\u00fc\u011f\u00fc Nedir? Ne \u0130\u015fe Yarar?<\/h4>\n<p>C programlama dilindeki <em>alloce<\/em> deyimine kar\u015f\u0131l\u0131k gelen stackalloc keyword\u00fc CLR(Common Language Runtime)&#8217;a belle\u011fin stack b\u00f6lgesinde yer ay\u0131rtmas\u0131n\u0131 sa\u011flamaktad\u0131r.<\/p>\n<p>\u00d6rne\u011fin; a\u015fa\u011f\u0131daki kod blo\u011funu incelerseniz e\u011fer stackalloc keyword\u00fc sayesinde belle\u011fin stack k\u0131sm\u0131nda int tipinde 3 adet(<em>3 x 4 = 12 bytel\u0131k<\/em>) yer ay\u0131rtmaktad\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            unsafe\r\n            {\r\n                int* Pointer = stackalloc int&#x5B;3];\r\n            }\r\n<\/pre>\n<p>Bu \u015fekilde yap\u0131lan bir tan\u0131mlama sayesinde yukar\u0131da da bahsedildi\u011fi \u00fczere belle\u011fin stack k\u0131sm\u0131nda int tipinden 3 x 4 = 12 bytel\u0131k bir alan ard\u0131\u015f\u0131l olarak ayr\u0131lm\u0131\u015ft\u0131r. Burada bilmeniz gereken &#8220;Pointer&#8221; isimli g\u00f6stericimiz ayr\u0131lan alanlardan ilk olan\u0131 temsil etmektedir. Bu demek oluyor ki, g\u00f6stericimize &#8220;+= 1&#8221; diyerek aritmatik bir i\u015flem sonucu sonraki alanlara eri\u015febiliriz.<\/p>\n<p>Haliyle stackalloc deyimi bizleri fixed keyword\u00fcn\u00fc kullanmaktan kurtarmaktad\u0131r. Nihayetinde fixed keyword\u00fc nesnelerin \u00fcye elemanlar\u0131n\u0131n garbage collector mekanizmas\u0131 sayesinde bellek adreslerinin de\u011fi\u015ftirilmemesi i\u00e7in bir sabitleyici g\u00f6revi almaktayd\u0131. \u0130\u015fte bu y\u00fczden yukar\u0131da linkini vermi\u015f oldu\u011fum bir \u00f6nceki g\u00f6stericiler ile dizilerin kullan\u0131m\u0131na de\u011findi\u011fimiz makalemizde dizilerin belle\u011fin heap b\u00f6lgesinde olu\u015fturuldu\u011fundan bahsederek, System.Array s\u0131n\u0131f\u0131n\u0131n bir \u00fcyeleri olmalar\u0131ndan dolay\u0131 fixed keyword\u00fc ile \u00fczerlerinde \u00e7al\u0131\u015fmaktayd\u0131k. stackalloc keyword\u00fc ise diziyi belle\u011fin heap b\u00f6lgesinde de\u011fil stack b\u00f6lgesinde olu\u015fturmam\u0131z\u0131 sa\u011flamakta ve unmanaged type(y\u00f6netilmeyen tip) olarak \u00e7al\u0131\u015fmam\u0131z\u0131 s\u00fcrd\u00fcrebilmekteyiz.<\/p>\n<h4>Peki stackalloc Anahtar S\u00f6zc\u00fc\u011f\u00fcn\u00fc Neden Tercih Ederiz?<\/h4>\n<p>Managed type(y\u00f6netilen tip)&#8217;de \u00e7al\u0131\u015fmak unmanaged type&#8217;de \u00e7al\u0131\u015fmaktan her ne kadar kolay ve kullan\u0131\u015fl\u0131 olsada baz\u0131 durumlarda performans eksiklikleri s\u00f6z konusudur. Mesela, belle\u011fin heap k\u0131sm\u0131nda tan\u0131mlanm\u0131\u015f ve System.Array s\u0131n\u0131f\u0131ndan t\u00fcremi\u015f bir dizinin elemanlar\u0131na ula\u015fmakla, stack k\u0131sm\u0131nda tan\u0131mlanm\u0131\u015f bir dizinin elemanlar\u0131na eri\u015fmek aras\u0131nda zaman ve maliyet a\u00e7\u0131s\u0131ndan olduk\u00e7a fark vard\u0131r.<\/p>\n<blockquote><p><em><strong>Belle\u011fin stack k\u0131sm\u0131nda stackalloc keyword\u00fc ile \u00fcretilen diziler unmanaged type dizilerdir.<\/strong><\/em><\/p><\/blockquote>\n<p>G\u00f6stericiler s\u00f6z konusu oldu\u011funda her ne kadar olas\u0131 hatalar s\u00f6z konusu olsada ayn\u0131 durum belle\u011fin stack k\u0131sm\u0131nda olu\u015fturulmu\u015f diziler i\u00e7inde ge\u00e7erli olacakt\u0131r. Nihayetinde i\u015faret\u00e7iler i\u015fin i\u00e7indedir ve bu dizileri kullan\u0131rken olduk\u00e7a dikkatli olmam\u0131z gerekmektedir.<\/p>\n<p><strong>Peki hoca, nas\u0131l durumlara kar\u015f\u0131 dikkatli olmam\u0131z gerekmektedir?<\/strong> diye sorabilirsiniz&#8230; \u015e\u00f6yle d\u00fc\u015f\u00fcn\u00fcn&#8230; Managed type dizilerde s\u0131n\u0131rlar a\u015f\u0131ld\u0131\u011f\u0131 zaman hata al\u0131yoruz de\u011fil mi? Unmanaged type dizilerde ise s\u0131n\u0131r kavram\u0131 bulunmamaktad\u0131r. Bunun sebebi ilgili dizinin elemanlar\u0131 i\u015faret\u00e7iler ile ifade edilece\u011fi i\u00e7in s\u0131n\u0131r kavram\u0131 olmayacakt\u0131r. Stack&#8217;te ki bir dizinin s\u0131n\u0131r\u0131n\u0131 a\u015ft\u0131\u011f\u0131m\u0131z zaman bize tahsis edilmeyen bellek alanlar\u0131na ula\u015fm\u0131\u015f olaca\u011f\u0131z. Tabi bu alanlar koruma alt\u0131ndaysalar olas\u0131 hatalar verebilirler. Bunun d\u0131\u015f\u0131nda bilin\u00e7siz bir \u015fekilde bilmedi\u011fimiz alanlara eri\u015fmi\u015f bulunaca\u011f\u0131z ama her zaman hata almayaca\u011f\u0131z. \u00d6zellikle dizinin s\u0131n\u0131rlar\u0131n\u0131 a\u015ft\u0131\u011f\u0131m\u0131z i\u00e7in kesinlikle hata almayaca\u011f\u0131z&#8230;<\/p>\n<p>\u015eimdi gelin belle\u011fin stack k\u0131sm\u0131nda bir dizi olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            unsafe\r\n            {\r\n                int* dizi = stackalloc int&#x5B;3]; \/\/ Belle\u011fin stack k\u0131sm\u0131nda 3 x 4 = 12 byte'l\u0131k alan ayr\u0131ld\u0131.\r\n                for (int i = 0; i &lt; 3; i++)\r\n                {\r\n                    *(dizi + i) = i + 10;\r\n                    Console.WriteLine(*(dizi + i));\r\n                }\r\n            }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere belle\u011fin stack k\u0131sm\u0131nda stackalloc keyword\u00fc ile bu \u015fekilde dizi olu\u015fturulmaktad\u0131r. &#8220;dizi&#8221; referans\u0131 ilk olarak olu\u015fturulan bellek alanlar\u0131n\u0131n ilkini temsil etmektedir.<\/p>\n<p>Yukar\u0131 sat\u0131rlarda bahsetmi\u015f oldu\u011fumuz stack&#8217;te ki dizilerin s\u0131n\u0131r kavram\u0131 olmad\u0131\u011f\u0131n\u0131 a\u015fa\u011f\u0131daki kod blo\u011fu sayesinde daha net bir \u015fekilde g\u00f6rmekteyiz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            unsafe\r\n            {\r\n                int* dizi = stackalloc int&#x5B;3]; \/\/ Belle\u011fin stack k\u0131sm\u0131nda 3 x 4 = 12 byte'l\u0131k alan ayr\u0131ld\u0131.\r\n                for (int i = 0; i &lt; 10; i++)\r\n                {\r\n                    *(dizi + i) = i + 10;\r\n                    Console.WriteLine(*(dizi + i));\r\n                }\r\n            }\r\n<\/pre>\n<p>Dikkat ederseniz dizimiz 3 elemanl\u0131d\u0131r lakin for d\u00f6ng\u00fcs\u00fcnde 10 kez tur d\u00fczenlenmi\u015ftir. Yap\u0131lan i\u015flemler neticesinde ilgili dizinin s\u0131n\u0131r\u0131 teorik olarak a\u015f\u0131lm\u0131\u015f olsada bir s\u0131n\u0131r a\u015f\u0131lmaya dair kesin bir hata s\u00f6z konusu olmayacakt\u0131r.<\/p>\n<blockquote><p><em><strong>stackalloc anahtar s\u00f6zc\u00fc\u011f\u00fc ile tahsis edilen bellek alanlar\u0131n\u0131n ard\u0131\u015f\u0131l olmas\u0131 garanti alt\u0131na al\u0131nm\u0131\u015f olur.<\/strong><\/em><\/p><\/blockquote>\n<p>\u015eimdi farkl\u0131 bir noktaya de\u011finmek i\u00e7in a\u015fa\u011f\u0131daki ba\u015flang\u0131\u00e7 a\u015famas\u0131ndan olan kod blo\u011funu yeniden ele alal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            unsafe\r\n            {\r\n                int* dizi = stackalloc int&#x5B;3];\r\n            }\r\n<\/pre>\n<p>stackalloc keyword\u00fc ile belle\u011fin stack k\u0131sm\u0131nda 3 adet int tipinde 12 byte&#8217;l\u0131k alan ay\u0131rm\u0131\u015f olduk. Bunu biliyoruz. Ancak bu ayr\u0131lan alanlar\u0131n i\u00e7eriklerinde neler var bilmiyoruz. Bu ayr\u0131lan bellek adreslerinin i\u00e7erisinde rastgele verilerin\/de\u011ferlerin bulundu\u011fu 12 byte&#8217;l\u0131k bir alandan bahsedebiliriz.<\/p>\n<p>Bunu a\u015fa\u011f\u0131daki \u015fu \u00f6rnekle daha net g\u00f6rebiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            unsafe\r\n            {\r\n                int* dizi = stackalloc int&#x5B;15];\r\n                for (int i = 0; i &lt; 15; i++)\r\n                    Console.WriteLine($&quot;{i}. eleman de\u011feri : {*(dizi + i)}&quot;);\r\n            }\r\n<\/pre>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2017\/05\/C\u2019ta-G\u00f6stericiPointer-\u2013-stackalloc-Anahtar-S\u00f6zc\u00fc\u011f\u00fc-\u2013-IX.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2017\/05\/C\u2019ta-G\u00f6stericiPointer-\u2013-stackalloc-Anahtar-S\u00f6zc\u00fc\u011f\u00fc-\u2013-IX.png\" alt=\"C#\u2019ta G\u00f6sterici(Pointer) \u2013 stackalloc Anahtar S\u00f6zc\u00fc\u011f\u00fc \u2013 IX\" width=\"192\" height=\"272\" class=\"aligncenter size-full wp-image-6377\" \/><\/a><\/p>\n<p>Buradaki de\u011ferler ayr\u0131lan alanlardaki rastgele de\u011ferlerdir. Tabi ki de sizler farkl\u0131 sonu\u00e7lar alabilirsiniz. Ben ilgili projeyi derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m an bu de\u011ferler ayr\u0131lan alanlarda var oldu\u011fu i\u00e7in yazd\u0131r\u0131lm\u0131\u015ft\u0131r. Farkl\u0131 bir zamanda farkl\u0131 de\u011ferlerle kar\u015f\u0131la\u015fmam\u0131z ola\u011fand\u0131r.<\/p>\n<p>G\u00f6stericilerle ilgili bir yaz\u0131m\u0131z\u0131n daha sonuna gelmi\u015f bulunmaktay\u0131z. Bir sonraki i\u00e7eri\u011fimizde g\u00f6stericilerde indexer kullan\u0131m\u0131n\u0131 inceleyece\u011fiz.<\/p>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bir \u00f6nceki C#\u2019ta G\u00f6sterici(Pointer) \u2013 G\u00f6stericiler \u0130le Dizi \u0130\u015flemleri \u2013 VIII ba\u015fl\u0131kl\u0131 makalemizde g\u00f6stericiler ile dizi i\u015flemlerini fixed keyword\u00fc ile ele alm\u0131\u015ft\u0131k. Bu i\u00e7eri\u011fimizde ise \u00f6nceki makalemizle i\u00e7erik a\u00e7\u0131s\u0131ndan paralel do\u011frultuda olan ama&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3014,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[1803,1804,1799,1802,1761,1801,1793,1748,1797,1800,1806,1805,1795,1794,1796],"class_list":["post-6360","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","tag-alloce","tag-c-alloce","tag-c-stackalloc","tag-c-stackalloc-keyword","tag-cta-gosterici","tag-cta-pointerlar","tag-managed-type","tag-pointer","tag-stackalloc","tag-stackalloc-anahtar-sozcugu","tag-stackalloc-anahtar-sozcugu-ne-ise-yarar","tag-stackalloc-anahtar-sozcugu-nedir","tag-unmanaged-type","tag-yonetilen-tip","tag-yonetilmeyen-tip"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/6360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=6360"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/6360\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3014"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=6360"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=6360"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=6360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}