Рассмотрим следующий код:
QSqlQuery *queryQt; // represents a row in a database table
inline std::string getCString(size_t col) {
return queryQt->value(col).toString().toStdString();
}
где queryQt->value(col).toString()
представляет собой строковое значение определенного столбца строки в базе данных.
Предположим, что компилятор имеет все оптимизации.
Вопрос: это следующий код:
std::string a = T.getCString(0);
равнозначный
std::string a = queryQt->value(col).toString().toStdString();
или
std::string temp = queryQt->value(col).toString().toStdString();
std::string a = temp;
?
Обновление вопроса:
это имеет значение, если я добавлю const к типу возвращаемого значения?
Как следующий код инициализация a
и не присваивая ему
std::string a = T.getCString(0);
эквивалентно
std::string a(T.getCString(0)); // Construct "a" with return value of function.
или же
std::string a(std::string(queryQt->value(0).toString().toStdString()));
Это означает, что будет копия конструкции std::string
при возврате из функции и другой конструкции копирования при построении a
из возвращаемого значения. Итак, 2 экземпляра.
Однако на компиляторах C ++ 11, переместить строительство будет использоваться вместо этого при построении возвращаемого значения и a
Как оба std::string
Объекты, построенные из временных. Это означает, что будет только 2 хода вместо 2 копий.
И, наконец, из-за копировать elision оптимизации Скорее всего, компилятор уничтожит все копии и просто создаст std::string
прямо в a
, в результате чего вообще нет копий.
Встраивание функции не имеет отношения к числу копий, которые будут сделаны. Изменение типа возврата на const
предотвратит движение, поскольку вы не можете двигаться от константного объекта.
Это эквивалентно
std::string temp = queryQt->value(col).toString().toStdString();
std::string a = temp;
В теории, по крайней мере. В зависимости от вашего фактического компилятора и его настроек, функция может не быть встроенной, даже если inline
ключевое слово. Большинство современных компиляторов (в настройках релиза) также оптимизируют код для
std::string a = queryQt->value(col).toString().toStdString();