Helpers - компьютеры, интернет, программирование

явная генерация кода шаблона в объектном файле

Если у меня есть функция шаблона в отдельной единице компиляции (которая создает объектный файл с суффиксом .o из компилятора CUDA C NVCC)

скажем, у нас есть определение (реализация)

template<typename T> 
void foo(T a){
   // something
}

Чтобы создать явный код в объектном файле, чтобы иметь возможность ссылаться на него из другой единицы компиляции, мне нужно явно создать экземпляр этого шаблона (для всех необходимых мне параметров шаблона):

template void foo<double>(double a);
template void foo<float>(double a);

Это приводит к фактическому коду в объектном файле.

Выполнение других вещей, таких как:

template<> void foo<double>(double a);
template<> void foo<float>(float a);

Не создает код в объектном файле, поскольку это полное специализированное объявление шаблона. Это правильно?

Также

void foo(double a);
void foo(float a);

не создает код, поскольку это было бы декларацией перегрузки ? это правильно?

Теперь возникает вопрос: каков общий синтаксис, позволяющий компилятору создавать код для шаблонной функции или класса в отдельной единице компиляции?


  • Ваше полное специализированное объявление шаблона — это просто объявление. Там нет определения, следовательно, нет кода. Это не экземпляр. (Кстати, это не связано с CUDA). 27.05.2014
  • Вы правы, что он не создает код. Чтобы создать код при компиляции отдельной единицы компиляции, вам необходимо иметь доступ к объявлению и определениям шаблона во время компиляции (а не во время компоновки), отсюда все обсуждения шаблонов в заголовках или явных экземплярах. Таким образом, чтобы компилятор создавал код для шаблонной функции или класса при компиляции другой единицы компиляции, вам необходимо иметь доступ к объявлению/определению, а затем использовать его или явно создать его экземпляр в этом блоке. Всегда твердый ODR. 27.05.2014

Ответы:


1

С точки зрения непрофессионала, когда вы пишете это:

template void foo<double>(double a);
template void foo<float>(double a);

Вы явно указываете компилятору создать экземпляр шаблона функции с правильными аргументами шаблона, поэтому вы получаете реализацию foo<double> и foo<float> так же, как если бы вы скопировали код из шаблона функции и заменили T на double и float.

С другой стороны, когда вы пишете это:

template<> void foo<double>(double a);
template<> void foo<float>(float a);

Вы говорите компилятору, что foo<double> и foo<float> - это совершенно разные вещи, не имеющие никакого отношения к foo<T>. Это называется специализацией. Однако вы не предоставляете определение для этих специализаций, а только объявления: вы просто сообщаете компилятору, что эти вещи существуют, но не что они собой представляют. Определение специализации будет выглядеть так:

template<>
void foo<double>(double a) {
    // something else
}

В зависимости от ваших намерений вы можете:

  • Используйте явное создание экземпляров (если foo<double> и foo<float> используют одну и ту же реализацию)
  • Используйте разные специализации, предоставляя фактические определения для этих специализаций.

Я предполагаю, что вы хотите первого.

27.05.2014
Новые материалы

Интуитивное понимание тензоров в машинном обучении
Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

Почему объяснимость так важна прямо сейчас?
По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

Анимированный математический анализ
Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

Создание простого слайдера изображений с помощью JavaScript
Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

Создание базы данных с помощью супергероя «Python»
В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

ИИ для чайников: руководство для начинающих по пониманию будущего технологий
Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..


© 2024 hlprs.ru, Helpers - компьютеры, интернет, программирование