У меня есть простой класс, который выглядит как Boost.Array.Существует два параметра шаблона T и N. Один из недостатков Boost.Array состоит в том, что каждый метод, использующий такой массив, должен быть шаблоном с параметром N (T - ОК).В результате вся программа является шаблоном.Одна из идей - создать интерфейс (абстрактный класс только с чисто виртуальными функциями), который зависит только от T (что-то вроде ArrayInterface).Теперь любой другой класс имеет доступ только к интерфейсу, и поэтому ему нужен только параметр шаблона T (который, в отличие от N, более или менее всегда известен).Недостаток здесь - это издержки виртуального вызова (более упущенная возможность встроенных вызовов), если используется интерфейс.Пока здесь только факты.
template<typename T>
class ArrayInterface {
public:
virtual ~ArrayInterface() {};
virtual T Get(int i) = 0;
};
template<typename T, int N>
class Array : ArrayInterface<T> {
public:
T Get(int i) { ... }
};
template<typename T, int N>
class ArrayWithoutInterface {
public:
T Get() { ... }
};
Но моя настоящая проблема заключается в другом.Когда я расширяю Boost.Array интерфейсом, прямое создание Boost.Array становится медленным (фактор 4 в одном случае, где это важно).Если я удаляю интерфейс, Boost.Array работает так же быстро, как и раньше.Я понимаю, что если метод вызывается через ArrayInterface, то возникают издержки, это нормально.Но я не понимаю, почему вызов метода становится медленнее, если есть только дополнительный интерфейс только с чисто виртуальными методами, а класс вызывается напрямую.
Array<int, 1000> a;
a.Get(0); // Slow
ArrayWithoutInterface<int, 1000> awi;
awi.Get(0); // Fast
GCC 4.4.3 и Clang 1.1показать то же поведение.