Сколько временных объектов создается, когда я возвращаю строку из встроенной функции?

Рассмотрим следующий код:

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 к типу возвращаемого значения?

2

Решение

Как следующий код инициализация 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 предотвратит движение, поскольку вы не можете двигаться от константного объекта.

Посмотрите на этот живой пример, используя мой шумный класс

3

Другие решения

Это эквивалентно

std::string temp = queryQt->value(col).toString().toStdString();
std::string a = temp;

В теории, по крайней мере. В зависимости от вашего фактического компилятора и его настроек, функция может не быть встроенной, даже если inline ключевое слово. Большинство современных компиляторов (в настройках релиза) также оптимизируют код для

std::string a = queryQt->value(col).toString().toStdString();
1

По вопросам рекламы [email protected]