{"id":1631,"date":"2020-01-30T14:16:57","date_gmt":"2020-01-30T14:16:57","guid":{"rendered":"https:\/\/www.yazilimperver.com\/?p=1631"},"modified":"2020-01-30T14:16:57","modified_gmt":"2020-01-30T14:16:57","slug":"haftalik-c-23-stdstring_view","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/","title":{"rendered":"Haftal\u0131k C++ 23 \u2013 std::string_view"},"content":{"rendered":"<p>Evet, bir di\u011fer yeni C++ kabiliyet yaz\u0131m\u0131z ile birlikteyiz. Bir s\u00fcredir farkl\u0131 mecralarda g\u00f6rd\u00fc\u011f\u00fcm ama bir t\u00fcrl\u00fc yazmak k\u0131smet olmayan <em>std::string_view<\/em> s\u0131nf\u0131na bug\u00fcn bir g\u00f6z ataca\u011f\u0131z.<\/p>\n<p>Bunu yaparken de \u00f6ncelikle, bu s\u0131n\u0131f \u00f6ncesinde elimizde neler vard\u0131, neden b\u00f6yle bir s\u0131n\u0131fa ihtiyac\u0131m\u0131z var, hangi durumlarda bunu kullanabiliriz ve hangi ko\u015fullarda kullanmak pek do\u011fru de\u011fil gibi hususlara bu yaz\u0131da k\u0131saca bakaca\u011f\u0131z.<\/p>\n<p>Bu kabiliyet C++ 17 ile aram\u0131za kat\u0131ld\u0131 ve kullanmak i\u00e7in\u00a0<strong>&lt;string_view&gt;<\/strong> ba\u015fl\u0131k dosyas\u0131n\u0131 eklemeniz gerekmektedir. Bu s\u0131n\u0131ftan \u00f6nce, metin y\u00f6netimi ve karakter dizileri i\u00e7in <em>std::string<\/em> ve C den de bildi\u011fimiz <em>const char*<\/em> dizilerimiz mevcuttu ve genel olarak kullan\u0131mlar\u0131na bakt\u0131\u011f\u0131m\u0131zda, a\u015fa\u011f\u0131daki gibi fonksiyonlara ge\u00e7irilip kullan\u0131labilmekteydiler:<\/p>\n<pre class=\"lang:c++ decode:true\">\/\/ 1) Eski C kullanimi\r\nvoid textAPICharArray(const char* input);\r\n\r\n\/\/ 2) C++ kullanimi\r\nvoid textAPIString(const string&amp; input);\r\n\r\n\/\/ 3) C++ 17 ile string_view kullan\u0131m\u0131\r\nvoid TakesStringView(std::string_view input);<\/pre>\n<p>Asl\u0131na bakarsan\u0131z normal \u015fartlarda bu kullan\u0131mlar\u0131n hi\u00e7 bir s\u0131k\u0131nt\u0131s\u0131 yok, ta ki farkl\u0131 tipte veriler ile u\u011fra\u015fmak zorunda kald\u0131\u011f\u0131n\u0131zda, i\u015fin rengi de\u011fi\u015fmeye ba\u015fl\u0131yor:<\/p>\n<ul>\n<li>\u00d6rne\u011fin, C++ kodu i\u00e7erisinde 1 no lu bir API&#8217;ye <em>std::string<\/em> ge\u00e7irme ihtiyac\u0131 oldu\u011funda, burada <em>c_str<\/em>() API&#8217;sini \u00e7a\u011f\u0131rman\u0131z gerekmekte,<\/li>\n<li>Benzer \u015fekilde elinizdeki <em>std::string<\/em> kullanan 2 nolu gibi bir API&#8217;ye karakter dizisi ge\u00e7irmek istedi\u011finizde, \u00e7o\u011fu durumda derleyici ge\u00e7ici bir <em>string<\/em> nesnesi olu\u015fturulacakt\u0131r.<\/li>\n<\/ul>\n<p>Yukar\u0131daki iki durum asl\u0131nda <em>std::string_view<\/em> i\u00e7in olas\u0131 en s\u0131k kullan\u0131mlar\u0131 te\u015fkil etmekte. Daha fazla detaya girmeden \u00f6nce, <em>std::string_view<\/em>&#8216;a bir g\u00f6z atal\u0131m.<\/p>\n<p><em>std::string_view<\/em>, salt-okunur karakter dizilerine (yazma hakk\u0131nda olmadan), herhangi bir sahiplik olmadan eri\u015fim sa\u011flayan bir s\u0131n\u0131f olarak ifade edebiliriz. Bir di\u011fer ifade ile, var olan bir karakter dizine, g\u00f6r\u00fcn\u00fcm\/eri\u015fim sa\u011flayan bir s\u0131n\u0131ft\u0131r.<\/p>\n<p>Bu s\u0131n\u0131f genel olarak, karakter dizisi verisine bir i\u015faret\u00e7i ve bu dizinin boyut bilgisini i\u00e7erecek \u015fekilde ger\u00e7eklenir.<\/p>\n<pre class=\"lang:c++ decode:true \">\/\/ Olasi bir tanimlama, \u00e7ok \u00e7ok basitlestirilmi\u015f\r\nstring_view {\r\n   size_t mLength;\r\n   const char* mStrData;\r\n};<\/pre>\n<p>Bu sebeple, bu s\u0131n\u0131f\u0131n kopyas\u0131n\u0131 olu\u015fturmak, bu s\u0131n\u0131f\u0131n i\u015faret etti\u011fi veriyi kopyalamayaca\u011f\u0131 i\u00e7in (&#8220;<em>shallow copy<\/em>&#8220;) olduk\u00e7a h\u0131zl\u0131 bir \u015fekilde ger\u00e7ekle\u015ftirmektedir. Bu anlamda <em>str::string_view<\/em> fonksiyonlara direk <strong>de\u011fer olarak ge\u00e7irilmelidir<\/strong> (&#8220;<em>pass by value<\/em>&#8220;).<\/p>\n<p>Bu s\u0131n\u0131f arac\u0131l\u0131\u011f\u0131 ile sunulan temel API&#8217;ler a\u015fa\u011f\u0131daki gibi listelenebilir. Dikkat edece\u011finiz \u00fczere, bu API&#8217;lerin hepsi veriyi de\u011fi\u015ftirmeyen API&#8217;ler. Peki <em>remove_prefix\/remove_suffix<\/em>&#8216;e ne olacak diye akl\u0131n\u0131za gelirse, asl\u0131nda bu API&#8217;lerde de arkadaki veri de\u011fi\u015ftirilmez. Sadece i\u015faret\u00e7i ve boyut bilgisi g\u00fcncellenir, buras\u0131 \u00f6nemli. Ayn\u0131 durum <em>substr<\/em>(), API&#8217;si i\u00e7in de ge\u00e7erlidir ama ona daha detayl\u0131 bakaca\u011f\u0131z.<\/p>\n<ul>\n<li><code>operator[]<\/code><\/li>\n<li><code>at<\/code><\/li>\n<li><code>front<\/code><\/li>\n<li><code>back<\/code><\/li>\n<li><code>data<\/code><\/li>\n<li><code>size<\/code>\/<code>length<\/code><\/li>\n<li><code>max_size<\/code><\/li>\n<li><code>empty<\/code><\/li>\n<li><code>remove_prefix<\/code><\/li>\n<li><code>remove_suffix<\/code><\/li>\n<li><code>swap<\/code><\/li>\n<li><code>copy<\/code>\u00a0(not\u00a0<code>constexpr<\/code>)<\/li>\n<li><code>substr<\/code>\u00a0&#8211; karma\u015f\u0131kl\u0131k<code>O(1)<\/code>,\u00a0\u00a0<code>std::string<\/code>\u00a0ile sunulan ise <code>O(n)<\/code>. Bu API \u00f6nemli, neden bu \u015fekilde bir fark var, birazdan buna de\u011finece\u011fim.<\/li>\n<li><code><\/code><code>compare<\/code><\/li>\n<li><code>find<\/code><\/li>\n<li><code>rfind<\/code><\/li>\n<li><code>find_first_of<\/code><\/li>\n<li><code>find_last_of<\/code><\/li>\n<li><code>find_first_not_of<\/code><\/li>\n<li><code>find_last_not_of<\/code><\/li>\n<li>s\u0131ralama operat\u00f6rleri:\u00a0<code>==, !=, &lt;=, &gt;=, &lt;, &gt;<\/code><\/li>\n<li><code>operator &lt;&lt;<\/code><\/li>\n<\/ul>\n<p>Tam liste ve detayl\u0131 a\u00e7\u0131klamalar i\u00e7in\u00a0<span style=\"color: #008000;\"><strong><span class=\"t-lc\"><a style=\"color: #008000;\" title=\"cpp\/string\/basic string view\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/string\/basic_string_view\">std::basic_string_view<\/a><\/span><\/strong><\/span>\u00a0adresine g\u00f6z atabilirsiniz.<\/p>\n<p>Bu s\u0131n\u0131f ile ilgili dikkat edilmesi gereken en \u00f6nemli nokta, i\u015faret etti\u011fi karakter dizisinin <strong>ya\u015fam s\u00fcresi\/kapsam\u0131<\/strong> \u00fczerinde <strong>hi\u00e7 bir etkisi yoktur<\/strong> ve bu sorumluluk tamamen kullan\u0131c\u0131dad\u0131r. Bunun bir \u015fekilde kotar\u0131lmas\u0131, kod b\u00fct\u00fcnl\u00fc\u011f\u00fc i\u00e7in \u00f6nemli.<\/p>\n<p>Yukar\u0131daki tan\u0131mlar \u0131\u015f\u0131\u011f\u0131nda, <em>string<\/em> ve benzeri referans\u0131 ge\u00e7irilen verileri de\u011fi\u015ftirmeden sadece eri\u015fmek istiyorsan\u0131z.<em> std::string_vie<\/em>w kullan\u0131m i\u00e7in tercih edilebilir. E\u011fer altta yatan veriye eri\u015fim ihtiyac\u0131 has\u0131l olursa da, <em>string<\/em> nesnesine bu <em>string_view<\/em> nesnesi ge\u00e7irilebilir.<\/p>\n<p>\u015eimdi gelelim, yukar\u0131da bahsetti\u011fimiz iki s\u0131k\u0131nt\u0131l\u0131 kullan\u0131m\u0131 <em>std::string_view<\/em> nas\u0131l \u00e7\u00f6z\u00fcyor. <em>std::string_view<\/em>, hem karakter dizisi i\u015faret\u00e7isi hem de <em>std::string<\/em> alan yap\u0131c\u0131lar bar\u0131nd\u0131rmaktad\u0131r. \u0130lk durumda (1. no&#8217;lu API kullan\u0131m\u0131), <em>string_view<\/em>, ilgili i\u015faret\u00e7iyi saklar ve <em>strlen()<\/em> ile boyut bilgisi saklan\u0131r. \u0130kinci durumda ise, zaten <em>std::string<\/em>&#8216;in bar\u0131nd\u0131rd\u0131\u011f\u0131 i\u015faret\u00e7i ve boyut direk saklan\u0131r.<\/p>\n<p><em>std::string_view<\/em>&#8216;\u0131n boyut anlam\u0131nda nas\u0131l bir avantaj sa\u011flad\u0131\u011f\u0131n\u0131 <a href=\"https:\/\/skebanga.github.io\/string-view\/\"><span style=\"color: #008000;\"><strong>https:\/\/skebanga.github.io\/string-view\/<\/strong><\/span><\/a>\u00a0sitesinde de detayl\u0131 bir \u015fekilde verilen bir \u00f6rnek kod \u00fczerinden inceleyelim. Bu kod \u00fczerinden normalde <em>std::string<\/em> ve benzeri karakter dizilerinin kullan\u0131m\u0131ndan \u00f6t\u00fcr\u00fc ne kadar dinamik bellek al\u0131nd\u0131\u011f\u0131n\u0131 ve<em> std::string_view<\/em> ile bunlar\u0131n ne kadar azalt\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6rece\u011fiz.<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\nusing namespace std;\r\n\r\n\/\/ new operatorunu yeniden tan\u0131mlayalim\r\nvoid* operator new(size_t n)\r\n{\r\n    cout &lt;&lt; \"[ \" &lt;&lt; n &lt;&lt; \" bytes kadar yer alindi]\\n\";\r\n    return malloc(n);\r\n}\r\n\r\n\/\/ karsilastirma metodumuz\r\nbool compare(const string&amp; s1, const string&amp; s2)\r\n{\r\n    bool result = false;\r\n    \r\n    if (s1 == s2) {\r\n        result = true;\r\n        cout &lt;&lt; '\\\"' &lt;&lt; s1 &lt;&lt; \"\\\" ile \\\"\" &lt;&lt; s2 &lt;&lt; \"\\\"\" &lt;&lt; \" ayn\u0131!\\n\"  ;\r\n    }\r\n    else\r\n        cout &lt;&lt; '\\\"' &lt;&lt; s1 &lt;&lt; \"\\\" ile \\\"\" &lt;&lt; s2 &lt;&lt; \"\\\"\" &lt;&lt; \" ayni degil!\\n\"  ;\r\n    \r\n    return result;\r\n}\r\n\r\nint main()\r\n{\r\n    string str = \"Girdi stringi.\";\r\n\r\n    compare(str, \"test string 1.\");\r\n    compare(str, \"test string 2.\");\r\n    compare(str, \"test string 3.\");\r\n    compare(str, \"Girdi stringi.\");\r\n\r\n    return 0;\r\n}<\/pre>\n<p>Bu kodu ben \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131mda a\u015fa\u011f\u0131daki \u00e7\u0131kt\u0131y\u0131 al\u0131yorum:<\/p>\n<pre class=\"lang:ps decode:true\">[ 39 bytes kadar yer alindi]\r\n[ 39 bytes kadar yer alindi]\r\n\"Girdi stringi.\" ile \"test string 1.\" ayni degil!\r\n[ 39 bytes kadar yer alindi]\r\n\"Girdi stringi.\" ile \"test string 2.\" ayni degil!\r\n[ 39 bytes kadar yer alindi]\r\n\"Girdi stringi.\" ile \"test string 3.\" ayni degil!\r\n[ 39 bytes kadar yer alindi]\r\n\"Girdi stringi.\" ile \"Girdi stringi.\" ayn\u0131!\r\n<\/pre>\n<p>Sizin de g\u00f6rece\u011finiz \u00fczere toplamda 5 * 39 byte&#8217;l\u0131k bir yer al\u0131n\u0131yor. Sadece bir ka\u00e7 kar\u015f\u0131la\u015ft\u0131rma i\u00e7in! \u015eimdi de ayn\u0131 kodu <em>std::string_view<\/em> kullanacak \u015fekilde g\u00fcncelleyip bir g\u00f6z atal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\n#include &lt;string_view&gt;\r\nusing namespace std;\r\n\r\n\/\/ new operatorunu yeniden tan\u0131mlayalim\r\nvoid* operator new(size_t n)\r\n{\r\n    cout &lt;&lt; \"[ \" &lt;&lt; n &lt;&lt; \" bytes kadar yer alindi]\\n\";\r\n    return malloc(n);\r\n}\r\n\r\n\/\/ Yeni karsilastirma metodumuz\r\nbool compare(string_view s1, string_view s2)\r\n{\r\n    bool result = false;\r\n    \r\n    if (s1 == s2) {\r\n        result = true;\r\n        cout &lt;&lt; '\\\"' &lt;&lt; s1 &lt;&lt; \"\\\" ile \\\"\" &lt;&lt; s2 &lt;&lt; \"\\\"\" &lt;&lt; \" ayn\u0131!\\n\"  ;\r\n    }\r\n    else\r\n        cout &lt;&lt; '\\\"' &lt;&lt; s1 &lt;&lt; \"\\\" ile \\\"\" &lt;&lt; s2 &lt;&lt; \"\\\"\" &lt;&lt; \" ayni degil!\\n\"  ;\r\n        \r\n    return result;\r\n}\r\n\r\nint main()\r\n{\r\n    string str = \"Girdi stringi.\";\r\n\r\n    compare(str, \"test string 1.\");\r\n    compare(str, \"test string 2.\");\r\n    compare(str, \"test string 3.\");\r\n    compare(str, \"Girdi stringi.\");\r\n\r\n    return 0;\r\n}<\/pre>\n<p>G\u00f6rece\u011finiz \u00fczere sadece <em>compare<\/em> metodunu g\u00fcncelliyoruz ve bu durumda elde etti\u011fimiz \u00e7\u0131kt\u0131 da a\u015fa\u011f\u0131daki gibi:<\/p>\n<pre class=\"lang:php decode:true \">[ 39 bytes kadar yer alindi]\r\n\"Girdi stringi.\" ile \"test string 1.\" ayni degil!\r\n\"Girdi stringi.\" ile \"test string 2.\" ayni degil!\r\n\"Girdi stringi.\" ile \"test string 3.\" ayni degil!\r\n\"Girdi stringi.\" ile \"Girdi stringi.\" ayn\u0131!<\/pre>\n<p>G\u00f6rece\u011finiz \u00fczere art\u0131k sadece bir kere bellek al\u0131n\u0131yor! Bu kullan\u0131m\u0131n sa\u011flayaca\u011f\u0131 bellek ve performans kazanc\u0131n\u0131 size b\u0131rak\u0131yorum. Bu kodta sadece <em>str<\/em> nesnesi i\u00e7in bir yer al\u0131n\u0131yor ve di\u011fer sabit karakter dizileri i\u00e7in herhangi bir yer al\u0131nm\u0131yor.<\/p>\n<p>Yukar\u0131daki \u00f6rnek i\u00e7in bir di\u011fer avantaj da asl\u0131nda, farkl\u0131 tipte karakter dizisi ve string tiplerinden kurtulmam\u0131z. \u00d6rne\u011fin, \u00f6nceki yaz\u0131lar\u0131mda oldu\u011fu gibi QT kullan\u0131yorsan\u0131z, yukar\u0131daki tek bir\u00a0<em>compare\u00a0<\/em>fonksiyonu i\u00e7in a\u015fa\u011f\u0131daki fonksiyonlar\u0131n hepsini tan\u0131mlanmaya ihtiya\u00e7 duyabilirsiniz!<\/p>\n<pre class=\"lang:c++ decode:true \">bool compare(const std::string&amp; s1, const std::string&amp; s2)\r\nbool compare(const std::string&amp; s1, const char* s2)\r\nbool compare(const std::string&amp; s1, const QString&amp; s2)\r\nbool compare(const char* s1, const std::string&amp; s2)\r\nbool compare(const char* s1, const char* s2)\r\nbool compare(const char* s1, const QString&amp; s2)\r\nbool compare(const Qstring&amp; s1, const std::string&amp; s2)\r\nbool compare(const Qstring&amp; s1, const char* s2)\r\nbool compare(const Qstring&amp; s1, const QString&amp; s2)<\/pre>\n<p><em>std::string_view<\/em>&#8216;\u0131n buraya kadar anlatt\u0131\u011f\u0131m kullan\u0131mlar\u0131 yan\u0131nda performans anlam\u0131nda daha g\u00f6ze \u00e7arpan avantaj sa\u011flad\u0131\u011f\u0131 bir di\u011fer durum da <em>substr<\/em>() ve benzeri API&#8217;lerin kullan\u0131m\u0131nda ortaya \u00e7\u0131kmaktad\u0131r.<\/p>\n<p>Hemen bir \u00f6rnek kod \u00fczerinden buna da bakal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true \">#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\n#include &lt;string_view&gt;\r\nusing namespace std;\r\n\r\n\/\/ new operatorunu yeniden tan\u0131mlayalim\r\nvoid* operator new(size_t n)\r\n{\r\n    cout &lt;&lt; \"[ \" &lt;&lt; n &lt;&lt; \" bytes kadar yer alindi]\\n\";\r\n    return malloc(n);\r\n}\r\n\r\nint main()\r\n{\r\n    \/\/ Gercekten uzun bir metin\r\n    string str = \"coooookkkkkkkk uuuuuzzzzzzzzzuuuuuuuuunnnnnnnnnnn biiiiiirrrrr mmmeeeeeeettttttinnnnn\";\r\n\r\n    \/\/ Eski yontem :) Bu durumda substr API'si yeni bir string olusturarak donuyor\r\n    \/\/ Alt satiri kapatirsaniz yukaridaki bellek disinda herhangi bir bellegin alinmad\u0131\u011f\u0131n\u0131 g\u00f6receksiniz\r\n    cout &lt;&lt; str.substr(15, 28) &lt;&lt; '\\n';\r\n    \r\n    \/\/ Yeni yontem: Hic bir kopya olusturulmuyor!\r\n    string_view view = str;\r\n    \r\n    \/\/ Ayni sekilde ilgili API'ler yine, yeni bir string_view nesnesi donuyorlar\r\n    cout &lt;&lt; view.substr(15, 28) &lt;&lt; '\\n';\r\n\r\n    return 0;\r\n}<\/pre>\n<p>Performans anlam\u0131nda somut bilgi ve analizler i\u00e7in kaynaklar k\u0131sm\u0131ndaki sitelere bir g\u00f6z atabilirsiniz. Sizlere bu s\u0131n\u0131f\u0131n do\u011fru kullan\u0131m\u0131nda neler kazand\u0131raca\u011f\u0131 hakk\u0131nda fikir verecektir.<\/p>\n<p>Evet, sevgili yaz\u0131l\u0131mperver dostlar\u0131m, bir C++ yaz\u0131m\u0131n daha sonuna geldik. Bir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek dile\u011fiyle.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Kaynaklar<\/strong><\/span><\/h2>\n<ul>\n<li><a href=\"https:\/\/www.bfilipek.com\/2018\/07\/string-view-perf.html\"><span style=\"color: #008000;\"><strong>https:\/\/www.bfilipek.com\/2018\/07\/string-view-perf.html<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/skebanga.github.io\/string-view\/\"><span style=\"color: #008000;\"><strong>https:\/\/skebanga.github.io\/string-view\/<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/www.modernescpp.com\/index.php\/c-17-avoid-copying-with-std-string-view\"><span style=\"color: #008000;\"><strong>https:\/\/www.modernescpp.com\/index.php\/c-17-avoid-copying-with-std-string-view<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/isocpp.org\/files\/papers\/N3762.html\"><span style=\"color: #008000;\"><strong>https:\/\/isocpp.org\/files\/papers\/N3762.html<\/strong><\/span><\/a><\/li>\n<li><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.learncpp.com\/cpp-tutorial\/6-6a-an-introduction-to-stdstring_view\/\">https:\/\/www.learncpp.com\/cpp-tutorial\/6-6a-an-introduction-to-stdstring_view\/<\/a><\/span><\/strong><\/li>\n<\/ul>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Evet, bir di\u011fer yeni C++ kabiliyet yaz\u0131m\u0131z ile birlikteyiz. Bir s\u00fcredir farkl\u0131 mecralarda g\u00f6rd\u00fc\u011f\u00fcm ama bir t\u00fcrl\u00fc yazmak k\u0131smet olmayan std::string_view s\u0131nf\u0131na bug\u00fcn bir g\u00f6z ataca\u011f\u0131z. Bunu yaparken de \u00f6ncelikle, bu s\u0131n\u0131f \u00f6ncesinde elimizde neler vard\u0131, neden b\u00f6yle bir s\u0131n\u0131fa ihtiyac\u0131m\u0131z var, hangi durumlarda bunu kullanabiliriz ve hangi ko\u015fullarda kullanmak pek do\u011fru de\u011fil gibi hususlara&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":174,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[10,188],"tags":[13,234,679,42,126,678,680],"class_list":["post-1631","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-yazilim-muhendisligi","tag-c","tag-c-17","tag-char-array","tag-modern-c","tag-string","tag-string_view","tag-strlen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Haftal\u0131k C++ 23 \u2013 std::string_view - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[:tr]Haftal\u0131k C++ 23 \u2013 std::string_view[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Evet, bir di\u011fer yeni C++ kabiliyet yaz\u0131m\u0131z ile birlikteyiz. Bir s\u00fcredir farkl\u0131 mecralarda g\u00f6rd\u00fc\u011f\u00fcm ama bir t\u00fcrl\u00fc yazmak k\u0131smet olmayan std::string_view s\u0131nf\u0131na bug\u00fcn bir g\u00f6z ataca\u011f\u0131z. Bunu yaparken de \u00f6ncelikle, bu s\u0131n\u0131f \u00f6ncesinde elimizde neler vard\u0131, neden b\u00f6yle bir s\u0131n\u0131fa ihtiyac\u0131m\u0131z var, hangi durumlarda bunu kullanabiliriz ve hangi ko\u015fullarda kullanmak pek do\u011fru de\u011fil gibi hususlara... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-30T14:16:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png\" \/>\n\t<meta property=\"og:image:width\" content=\"32\" \/>\n\t<meta property=\"og:image:height\" content=\"32\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"Haftal\u0131k C++ 23 \u2013 std::string_view\",\"datePublished\":\"2020-01-30T14:16:57+00:00\",\"dateModified\":\"2020-01-30T14:16:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/\"},\"wordCount\":1088,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"c++\",\"c++ 17\",\"char array\",\"Modern C++\",\"string\",\"string_view\",\"strlen()\"],\"articleSection\":[\"C++\",\"Yaz\u0131l\u0131m M\u00fchendisli\u011fi\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/\",\"name\":\"[:tr]Haftal\u0131k C++ 23 \u2013 std::string_view[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2020-01-30T14:16:57+00:00\",\"dateModified\":\"2020-01-30T14:16:57+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Haftal\u0131k C++ 23 \u2013 std::string_view\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yazilimperver.com\/#website\",\"url\":\"https:\/\/www.yazilimperver.com\/\",\"name\":\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yazilimperver.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"contentUrl\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[:tr]Haftal\u0131k C++ 23 \u2013 std::string_view[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/","og_locale":"tr_TR","og_type":"article","og_title":"[:tr]Haftal\u0131k C++ 23 \u2013 std::string_view[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Evet, bir di\u011fer yeni C++ kabiliyet yaz\u0131m\u0131z ile birlikteyiz. Bir s\u00fcredir farkl\u0131 mecralarda g\u00f6rd\u00fc\u011f\u00fcm ama bir t\u00fcrl\u00fc yazmak k\u0131smet olmayan std::string_view s\u0131nf\u0131na bug\u00fcn bir g\u00f6z ataca\u011f\u0131z. Bunu yaparken de \u00f6ncelikle, bu s\u0131n\u0131f \u00f6ncesinde elimizde neler vard\u0131, neden b\u00f6yle bir s\u0131n\u0131fa ihtiyac\u0131m\u0131z var, hangi durumlarda bunu kullanabiliriz ve hangi ko\u015fullarda kullanmak pek do\u011fru de\u011fil gibi hususlara... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2020-01-30T14:16:57+00:00","og_image":[{"width":32,"height":32,"url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png","type":"image\/png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"9 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"Haftal\u0131k C++ 23 \u2013 std::string_view","datePublished":"2020-01-30T14:16:57+00:00","dateModified":"2020-01-30T14:16:57+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/"},"wordCount":1088,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["c++","c++ 17","char array","Modern C++","string","string_view","strlen()"],"articleSection":["C++","Yaz\u0131l\u0131m M\u00fchendisli\u011fi"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/","name":"[:tr]Haftal\u0131k C++ 23 \u2013 std::string_view[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2020-01-30T14:16:57+00:00","dateModified":"2020-01-30T14:16:57+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/01\/30\/haftalik-c-23-stdstring_view\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Haftal\u0131k C++ 23 \u2013 std::string_view"}]},{"@type":"WebSite","@id":"https:\/\/www.yazilimperver.com\/#website","url":"https:\/\/www.yazilimperver.com\/","name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yazilimperver.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","contentUrl":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=1631"}],"version-history":[{"count":13,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1631\/revisions"}],"predecessor-version":[{"id":1677,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1631\/revisions\/1677"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media\/174"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=1631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=1631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=1631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}