OzkanOzdemir 1.560 Admin #1 Oluşturuldu: Mayıs 9, 2019 Merhaba, bu konumuzda C++ 11, C++ 17 ve Boost kütüphanesinde string trim yani string değerimizin sonundaki ve başındaki boşlukları silmeyi öğreneceğiz. Şunu belirtmek istiyorum Server dosyalarındaki kullanılan trim örneği C++ 11 kütüphanesine ait ve C++ 17 kütüphanesiyle derlemeye çalıştığınızda hata alacaksınız. Bunun sebebi ise C++17'den beri standart kütüphanenin bazı kısımları kaldırıldı. Biz şimdi bu kaldırılan kısımları yeni kütüphaneye göre uyarlanmış halini göreceğiz. Bir de şurada dikkate etmeniz gereken bir husus var. Server dosyalarında kullanılan rtrim ve ltrim fonksiyonları hem geriye string değer döndürüyor hem de parametre olarak string değeri convert ediyor. Bu yüzden std::string & rtrim yerine void rtrim kullanmanız daha mantıklı olacaktır. Gizli İçerik Gizli içeriği görmek için bu konuya bir mesaj yazın. 1 Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
4fairy 23 #2 Mayıs 9, 2019 tarihinde gönderildi Teşekkürler anlatımınız için yeni bilgiler ile işler biraz daha kolaylaşıcak sanırım :) Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
bytuku 212 #3 Mayıs 9, 2019 tarihinde gönderildi Teşekkürler Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
FrLasT 0 #4 Mayıs 22, 2019 tarihinde gönderildi Teşekkürler eline sağlık. Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
YigitHanSen 50 #5 Haziran 1, 2019 tarihinde gönderildi teşekkürler Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
baburbbr 0 #6 Haziran 21, 2019 tarihinde gönderildi teşekkürler Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
xBo 2 #7 Ağustos 10, 2019 tarihinde gönderildi Teşekkürler Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
eurox 0 #8 Eylül 29, 2019 tarihinde gönderildi Alıntı Bir de şurada dikkate etmeniz gereken bir husus var. Server dosyalarında kullanılan rtrim ve ltrim fonksiyonları hem geriye string değer döndürüyor hem de parametre olarak string değeri convert ediyor. Bu yüzden std::string & rtrim yerine void rtrim kullanmanız daha mantıklı olacaktır. Verdiğin gerekçe doğru değil. void func1(std::string str); void func1(std::string &str); Bu iki fonksiyonun amaçları farklı. Ancak eğer heapte olmayan bir değişkeni bu fonksiyonlara gönderirsen, stl sınıfların move constructorları olduğu için bu fonksiyonlara verilen değişkenler zaten taşınır hiç bir farkları yok. Yine aynı şekilde, std::string func1(std::string str); std::string& func1(std::string &str); Bu iki fonksiyondan referance dönen hatalı kullanım zaten. Eğer ki fonksiyon içinde stackte yarratığın değişkenin referansını dönersen explicit olarak move etmezsen zaten undefined behaviour sonucuyla karşılaşırsın. Burada en doğru kullanım birincisi eğer ki stackte trim yapılmış obje dönülecekse. Çünkü birincisinde stl sınıfın move constructor ı kopyalama yapmaz, stackteki değişkeni move eder. Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
PENTAGRAM 926 #9 Eylül 29, 2019 tarihinde gönderildi AlıntıVerdiğin gerekçe doğru değil. Alıntıvoid func1(std::string str); void func1(std::string &str); Bu iki fonksiyonun amaçları farklı. Ancak eğer heapte olmayan bir değişkeni bu fonksiyonlara gönderirsen, stl sınıfların move constructorları olduğu için bu fonksiyonlara verilen değişkenler zaten taşınır hiç bir farkları yok. Söylediğin senaryo "copy ellision" olarak geçer, eğer func1 fonksiyon çağrısından sonra str kısmına verdiğin parametreye refer etmiyorsan geçerli. Copy ellision c++17 standardına kadar mandatory bir olay değil. Hatta c++17 standardında dahi bazı caseler dışında mandatory değil. Dolayısıyla derleyicinin optimizasyon ayarlarına ve derleyicinin yazdığın pattern'i ne kadar iyi algılayabildiğine kalıyor olay. Özetle; Overload 1'e gelen her stack değişkeni move edilerek geliyor diye bir kaide yok. Bunun yerine rvalue overloadını yazıp değişkeni explicit move ile almak daha mantıklı, eğer ki istenen buysa. AlıntıYine aynı şekilde, std::string func1(std::string str); std::string& func1(std::string &str); Bu iki fonksiyondan referance dönen hatalı kullanım zaten. Eğer ki fonksiyon içinde stackte yarratığın değişkenin referansını dönersen explicit olarak move etmezsen zaten undefined behaviour sonucuyla karşılaşırsın. Burada en doğru kullanım birincisi eğer ki stackte trim yapılmış obje dönülecekse. Çünkü birincisinde stl sınıfın move constructor ı kopyalama yapmaz, stackteki değişkeni move eder. Burada da 2. overloadda referans, alınan parametreye ise bir sıkıntı yok. Builder pattern'ında sıkça kullanılan bir durum. Diğer senaryolarda ise function-local olan variable thread_local veya static olarak declare edilmediyse "reference to temporary" durumuyla karşılaşırsın. Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
Kaanizm33 0 #10 Mayıs 24, 2020 tarihinde gönderildi Teşekkürler Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
Mert77 11 #11 Haziran 6, 2022 tarihinde gönderildi Teşekkürler Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
MohamedSuper 3 #12 Mayıs 15, 2023 tarihinde gönderildi Thanks Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
Asmodian 0 #13 Mart 14, 2024 tarihinde gönderildi Eline sağlık. Teşekkürler Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş