Может ли компилятор выполнить глобальную оптимизацию для аналогичной функции-члена шаблона classe? - PullRequest
3 голосов
/ 20 февраля 2012

Я создаю новый контейнер.Одним из параметров шаблона является его начальная емкость.В результате создание экземпляров с различными начальными возможностями приведет к тому, что компилятор сгенерирует один и тот же код для каждого шаблонного класса.

MyVector<3> firstVector;
MyVector<4> secondVector;
...
if (firstVector.empty() && secondVector.empty())
{
   ...
}

Этот фрагмент заставит компилятор сгенерировать empty() для обоих классов.Может ли компилятор устранить эту избыточность?

Ответы [ 3 ]

3 голосов
/ 20 февраля 2012

Прежде всего, empty() возможно будет очень простым, и компилятор сможет встроить его.Что, если это не может быть встроено?Компилятор может выполнять любые виды слияния, но он должен делать это таким образом, чтобы разные функции имели разные адреса:

&MyVector<3>::empty() != &MyVector<4>::empty()

Visual C ++ 10 может демонстрировать нестандартное поведение в зависимости от настроек компоновщика - с некоторыми настройкамион обнаружит такие функции и просто объединит их, нарушив Стандарт.Я никогда не видел, чтобы такое устранение выполнялось в соответствии со стандартами.

0 голосов
/ 07 апреля 2013

Использует ли метод empty () параметр шаблона?Если нет, вы можете выделить его в базовый класс без шаблонов, от которого наследуется шаблонный класс.

0 голосов
/ 20 февраля 2012

Вероятно, компилятор не устраняет это. Рассмотрим следующий пример:

template<size_t CAPACITY>
class MyVector {
...
public:
  bool empty() const { static int i = CAPACITY; return ...; }
};

В приведенном выше примере вы можете видеть, что каждый MyVector<N>::empty() должен быть уникальным, потому что static int i должен быть эксклюзивным для функции. Даже если static int отсутствует, компилятор всегда будет предполагать его возможность. Таким образом, если будет сгенерирована копия empty(), она будет сгенерирована для всех версий.

Я отвечаю теоретически. Не знаю, есть ли у компилятора какая-то практическая техника оптимизации, которая бы преодолела такие вещи.

Однако, если ваш MyVector выглядит так:

template<size_t CAPACITY, typename T>
class MyVector : public vector<T>
{
  // using vector<T>::empty;
};

Тогда будет сгенерирована только одна копия.

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