У геттера нулевая стоимость? - PullRequest
5 голосов
/ 24 октября 2011

У меня есть простой класс:

class A {
    public:
    int get() const;

    private:
    void do_something();
    int value;
}

int A::get() const {
    return value;
}

Функция получения проста и понятна.Получатели должны использовать их, поэтому в do_something я должен использовать get() для доступа к value.Мой вопрос: оптимизирует ли компилятор геттер, так что это будет эквивалентно прямому доступу к данным?Или я все равно получу производительность, если получу доступ напрямую (что подразумевает худший дизайн)?

A::do_something()
{
    x = get();
    // or...
    x = value;
}

Ответы [ 5 ]

7 голосов
/ 24 октября 2011

Когда метод не виртуальный, компиляторы могут его оптимизировать.Хорошие компиляторы (с оптимизацией по времени компоновки) могут оптимизировать, даже если метод не inline и определен в отдельном файле .cpp.Не очень хорошие могут сделать это, только если это объявлено внутри определения класса или в заголовочном файле с ключевым словом inline.Для виртуальных методов это зависит, но, скорее всего, нет.

3 голосов
/ 24 октября 2011

Компилятор почти наверняка встроит такой тривиальный геттер, если у него есть доступ к определению.

2 голосов
/ 24 октября 2011

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

Однако для отладочных сборок характерно отключение встраивания, что вполне допустимо, поскольку компиляторы не обязаны ничего встроять.

1 голос
/ 24 октября 2011

Во-первых, вы не сможете манипулировать значением внутри вашего объекта, если вы не вернете ссылку, а не значение:

int& get();

Теперь он возвращает ссылку и может быть изменен. Но имхо это не совсем чисто, вы также должны определить установщик и использовать его для записи измененного значения:

int get() const;
void set(int);

...
A::do_something()
{
    x = get();
    set(value);
}

Производительность установщика зависит от вашего компилятора. Большинство современных компиляторов способны встроить простые геттеры / сеттеры, поэтому не должно быть никаких потерь производительности.

1 голос
/ 24 октября 2011

Что ж, использование get обычно лучше, потому что оно скрывает фактическую логику, используемую для получения значения (сегодня это поле, завтра может потребоваться более сложная логика). Что касается производительности, то при доступе к самому значению всегда будет как минимум так же быстро, как при использовании get, компилятор, скорее всего, все равно будет встроен в вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...