Когда проектируешь класс Matrix на C++, лучше использовать синтаксис operator() (например, m(i,j)) вместо синтаксиса operator[] (например, m[i][j]). Оба подхода работают, но метод operator() даёт больше гибкости и потенциала для оптимизации.
Подход "массив массивов" использует цепочку операторов индексирования, где operator[] возвращает ссылку на промежуточный объект Array, у которого есть свой operator[], возвращающий реальный элемент. Это создаёт интуитивный синтаксис m[i][j], но ограничивает гибкость реализации.
Подход operator() даёт критические преимущества:
Возьми практический пример: когда алгоритмы последовательно обращаются к столбцам матрицы с построчной раскладкой, процессор получает промахи кэша почти при каждом обращении. Переключив физическую раскладку на поколоночную с использованием operator(), один проект добился ускорения на 20% без изменения клиентского кода.
Подход operator() не имеет никаких минусов по сравнению с подходом "массив массивов". Он одинаково легко реализуется для плотных построчных раскладок, когда это оптимально, и при этом значительно проще для разреженных матриц, поколоночного хранения и других специализированных раскладок.
Используй operator() для интерфейса своего класса Matrix.
Подход с operator() для доступа к элементам матрицы позволяет тебе изменить внутреннее расположение памяти с row-major на column-major без изменения публичного интерфейса, тогда как подход array-of-array с operator[] потребовал бы изменений в коде клиента.
Новый — ещё не проверен сообществом
Вы