Меня интересует вопрос, касающийся оптимизации сложного возвращаемого значения.
Например, ситуация такая:
class Bound
{
public:
// ...
float getTop() const;
float getRight() const;
float getBottom() const;
float getLeft() const;
private:
// ...
float top;
float right;
float bottom;
float left;
};
class Object
{
public:
// ...
Bound getBound() const;
private:
// ...
Bound bound;
};
void some_function()
{
Object object;
// ...
const float top = object.getBound().getTop();
}
Действительно ли для строки:
const float top = object.getBound().getTop();
Компилятор способен убрать все лишние операции, в том числе операции копирования того, что мне не нужно?
Во многих библиотеках (в той же SFML) составные объекты возвращаются в виде копии. Это выглядит так, словно для получения значения одного поля приходится делать копию всего объекта вместе со всем его содержимым, которое мне не нужно.
От такого кода сишник внутри меня яростно негодует...
Действительно, способен, но это не гарантируется.
Вы легко можете проверить сами, проверяя что выполняется, если не отладчиком, не ассемблером, то немножко изменив код:
struct F {
float f = 0.1;
F() = default;
F(const F&) { std::cout << "FCopy\n"; }
};
class Bound {
public:
// ...
Bound() = default;
Bound(const Bound&)
{ std::cout << "BCopy\n";}
F getTop() const
{ return top;}
private:
// ...
F top;
};
class Object
{
public:
// ...
Bound getBound() const
{ return bound; }
private:
// ...
Bound bound;
};
int main() {
Object object;
const float top = object.getBound().getTop().f;
return 0;
}
На консоли будет виден результат копирований.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости