﻿# V811\. Decreased performance\. Excessive type casting: string \-\> char \* \-\> string\.

Анализатор обнаружил код, который потенциально можно оптимизировать\. В коде присутствует избыточное создание объекта типа 'std::string', от которого можно избавиться\.

У объекта класса 'std::string' с помощью функции 'c\_str\(\)' берется указатель на массив символов\. Затем из этих символов конструируется новый объект типа 'std::string'\. Например, это возможно, если неоптимальное выражение является:

* аргументом вызова функции;
* операндом оператора присваивания;
* операндом оператора 'return'\.

Рассмотрим пример для случая с вызовом функции:

```cpp
void foo(const std::string &s)
{
  ....
}
....
void bar()
{
  std::string str;
  .... 
  foo(str.c_str());
}
```

Улучшить код очень просто \- достаточно убрать вызов метода 'c\_str\(\)'\. Рассмотрим пример упрощенного кода: 

```cpp
....
void bar()
{
  std::string str;
  .... 
  foo(str);
}
```



Пример некорректного кода для оператора присваивания будет иметь вид:

```cpp
std::string str;
.... 
std::string s = str.c_str();
```



Пример некорректного кода для оператора 'return' будет иметь вид:

```cpp
std::string foo(const std::string &str)
{
  .... 
  return str.c_str();
}
```



Исправить ошибку в этих случаях следует аналогично случаю для вызова функции\.