Son zamanlarda bazı gerekli optimizasyonları yapıyorum. Yaptığım bir şey, bazı ostringstream'leri değiştirmek -> sprintfs. Ben ac stil dizisi, ala std :: dizeleri bir demet sprintf'ing
char foo[500];
sprintf(foo, "%s+%s", str1.c_str(), str2.c_str());
Microsoft'un std :: string :: c_str () uygulamasının sabit zamanda çalıştığı ortaya çıkıyor (sadece dahili bir işaretçi döndürüyor). Görünüşe göre libstdc ++ aynı şeyi yapıyor . Std'nin c_str için hiçbir garanti vermediğini, ancak bunu yapmanın başka bir yolunu hayal etmek zor. Örneğin, bir arabellek için bellek ayırmak zorunda kalacakları belleğe kopyalanırlarsa (onu yok etmek için arayana bırakırlar - STL sözleşmesinin bir parçası DEĞİLDİR) VEYA dahili bir statike kopyalamak zorunda kalacaklar tampon (muhtemelen threadsafe değildir ve kullanım ömrü boyunca garantiniz yoktur). Bu nedenle, yalnızca dahili olarak tutulan boş sonlandırılmış dizeye bir işaretçi döndürmek tek gerçekçi çözüm gibi görünüyor.
c_str
Bir const yöntemi olmasına rağmen (veya en azından bir const aşırı yükü var - hangisini unutuyorum), bu mantıksal değeri değiştirmez, bu nedenle bir neden olabilirmutable
. Bu ederim dan işaretçileri kırmak diğer çağrılarıc_str
, bu tür işaretçileri aynı mantıksal dizeye atıfta gerektiğini hariç (böylece yeniden tahsis için hiçbir yeni nedeni var - zaten boş sonlandırıcı olmalıdır) ya da başka zaten olmayan bir çağrı orada olmalı - arasındaki yöntem.