Основная часть этого вопроса относится к правильному и наиболее вычислительно эффективному методу создания общедоступного доступа для доступа к частному члену данных внутри класса. В частности, используя ссылку const type &
для доступа к таким переменным, как:
class MyClassReference
{
private:
int myPrivateInteger;
public:
const int & myIntegerAccessor;
// Assign myPrivateInteger to the constant accessor.
MyClassReference() : myIntegerAccessor(myPrivateInteger) {}
};
Однако текущий установленный метод решения этой проблемы заключается в использовании постоянной "геттерной" функции, как показано ниже:
class MyClassGetter
{
private:
int myPrivateInteger;
public:
int getMyInteger() const { return myPrivateInteger; }
};
Необходимость (или ее отсутствие) для "геттеров/сеттеров" уже неоднократно хешировалась по таким вопросам, как: Соглашения для методов доступа (getters and setters) в С++ Однако это не проблема.
Оба этих метода имеют ту же функциональность, что и синтаксис:
MyClassGetter a;
MyClassReference b;
int SomeValue = 5;
int A_i = a.getMyInteger(); // Allowed.
a.getMyInteger() = SomeValue; // Not allowed.
int B_i = b.myIntegerAccessor; // Allowed.
b.myIntegerAccessor = SomeValue; // Not allowed.
Узнав об этом и не найдя в Интернете ничего об этом, я спросил нескольких моих наставников и профессоров, для которых это уместно и каковы относительные преимущества/недостатки каждого. Тем не менее, все ответы, которые я получил, хорошо сочетались с двумя категориями:
- Я даже не думал об этом, но использую метод "getter" , поскольку это "Установленная практика".
- Они работают одинаково (оба они работают с одинаковой эффективностью), но используют метод "getter" , поскольку это "Установленная практика".
Хотя оба эти ответа были разумными, поскольку оба они не смогли объяснить "почему", я остался неудовлетворенным и решил продолжить рассмотрение этого вопроса. В то время как я провел несколько тестов, таких как среднее использование символов (они примерно одинаковы), среднее время набора текста (опять-таки примерно такое же), один тест показал крайнее несоответствие между этими двумя методами. Это был тест времени выполнения для вызова аксессуар и назначение его целому числу. Без каких-либо флагов -OX
(в режиме отладки) MyClassReference
выполняется примерно на 15% быстрее. Однако, как только был добавлен флаг -OX
, в дополнение к выполнению намного быстрее оба метода работают с одинаковой эффективностью.
Таким образом, мой вопрос состоит из двух частей.
- Как эти два метода отличаются друг от друга, и что заставляет вас быть быстрее/медленнее, чем другие только с определенными флагами оптимизации?
- Почему существует установленная практика использования постоянной функции "getter" , а использование постоянной ссылки редко известно, а не используется?
Как отмечалось в комментариях, мое тестовое тестирование было ошибочным и не имело никакого отношения к этому вопросу. Однако для контекста он может быть расположен в истории изменений.