C++, оптимизация сложного возвращаемого значения

157
22 ноября 2021, 00:40

Меня интересует вопрос, касающийся оптимизации сложного возвращаемого значения.

Например, ситуация такая:

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

От такого кода сишник внутри меня яростно негодует...

Answer 1

Действительно, способен, но это не гарантируется.

Answer 2

Вы легко можете проверить сами, проверяя что выполняется, если не отладчиком, не ассемблером, то немножко изменив код:

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;
}

На консоли будет виден результат копирований.

READ ALSO
Не судите строго

Не судите строго

Подскажите,как сделать так чтобы огромной количество if-ов работало вместе и приводило к ответу? Моя программа ничего не выводит, а должна

84
Наследование функций C++

Наследование функций C++

Ситуация такаяЕсть класс A в котором есть функция protected virtual f

76
Проблема при кодировании данных

Проблема при кодировании данных

Таким образом кодирую int, но при декоде большие числа не корректно отображаютсяПример в данном случае возвращает 10, но возьму число 10000 мне...

76
Ошибка компиляции C++ кода с Irrlicht библиотекой

Ошибка компиляции C++ кода с Irrlicht библиотекой

Я скомпилировал отдельно исходники Irrlicht (в source каталоге), затем создал Makefile где будет уже компилироваться мой файл на C++ и затем компоноваться...

145