Arhn - архитектура программирования

Оптимизируют ли современные компиляторы C++ повторяющиеся обращения к одному и тому же члену данных класса?

Рассмотреть возможность:

class A
{
public:
    const int& my_int_member() const { return my_int_member; }
    const double& my_double_member const {return my_double_member; }
private:
    int my_int_member;
    double my_double_member;
};

class B
{
public:
    const A& my_A_member() const { return my_A_member; }
private:
    A my_A_member;
};

Современные компиляторы С++ (например, msvc, clang, gcc), установленные с максимальным уровнем оптимизации, каждый из которых обеспечивает, обычно распознают и оптимизируют повторные доступы к одному и тому же члену данных, как в:

B b;
do_stuff(b.my_A_member().my_double_member(), b.my_A_member().my_int_member());
double c = b.my_A_member().my_double_member() + b.my_A_member().my_int_member();

То есть понимают ли они, что могут повторно использовать одну и ту же ссылку, или они просто снова выполняют доступ?


  • вы можете попробовать и посмотреть здесь: godbolt.org . я бы удивился, если бы не 27.08.2019
  • на самом деле я ожидал бы, что приличный компилятор создаст что-то эквивалентное double c = 0; для последней строки 27.08.2019
  • Может быть. Общий ответ дать невозможно. Это зависит от того, как реализован компилятор/оптимизатор — насколько агрессивно он ищет возможности для удаления повторных обращений и что он делает, если находит такую ​​возможность. Поставщики компиляторов КОНКУРИРУЮТ, делая вещи, включая оптимизацию, по-разному, каждый из которых делает то, что лучше подходит определенному набору пользователей (разработчиков), чем их конкуренты. Но ни один компилятор (пока) не идеален для всего. Единственный способ убедиться в этом для выбранных вами компиляторов и настроек оптимизации — проверить вывод компилятора. 27.08.2019

Ответы:


1

Если определение видно, и если компилятор может доказать, что он делает то же самое (оптимизация с помощью правила «как если бы») (что более сложно, чем мы можем, с псевдонимами, глобальными доступами и т. д.), он может это сделать. (и, вероятно, делает это).

Но представьте, что мы немного изменим ваш пример (b больше не является локальным, а задается как параметр):

void foo(B& b)
{
    do_stuff(b.my_A_member().my_double_member(), b.my_A_member().my_int_member());
    double c = b.my_A_member().my_double_member() + b.my_A_member().my_int_member();
}

Может ли do_stuff изменить глобальное значение B, которое будет параметром foo. Без определения ответ - да. Поэтому компилятор должен перезагрузить b.my_A_member() после вызова do_stuff

Для удобства чтения я бы все равно сделал:

B b;
const auto& a = b.my_A_member();
do_stuff(a.my_double_member(), a.my_int_member());
double c = a.my_double_member() + a.my_int_member();
27.08.2019
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..