Статические встроенные методы?
Вопрос
Ладно,
Вот что я пытаюсь сделать...Прямо сейчас он компилируется, но не удается связать...LNK2001
Я хочу, чтобы методы были статическими, потому что в них нет переменных-членов, однако я также хочу, чтобы они были встроенными для ускорения, которое они обеспечивают.
Каков наилучший способ сделать это?Вот что у меня есть в двух словах:
/* foo.h */
class foo
{
static void bar(float* in);
};
/* foo.cpp */
inline void foo::bar(float* in)
{
// some dark magic here
}
Я пытаюсь сделать это, потому что хочу иметь возможность уйти:
foo::bar(myFloatPtr);
foo не имеет никаких переменных-членов...в этом нет смысла.
Решение
Если вы вызываете bar из другого cpp-файла, отличного от foo.cpp, он должен быть в заголовочном файле.
Другие советы
Во-первых, я бы поместил их в namespace
вместо этого, потому что в этом вообще нет никакой логики "class"
.Во-вторых, вы можете определить тело функций непосредственно в заголовочном файле, чтобы компилятор мог их видеть.В противном случае вам нужно whole program optimization
должно быть выполнено компоновщиком для встраивания этих функций (AFAIK).
Вы должны определить свою встроенную функцию в заголовочном файле, а не в отдельном файле реализации.Определения необходимы, когда файл заголовка #включен, если, в конце концов, предполагается, что они будут встроены.
Ошибка ссылки, которую вы видите, связана с тем, что объявление (в файле заголовка) не информирует компилятор о том, что метод должен быть встроенным, тогда как реализация является встроенной, поэтому недоступна для связывания.
Обычно встроенные функции реализуются там, где они объявлены (в заголовочном файле).Компилятор может свободно использовать встроенные функции в том виде, в каком они у вас есть, но вы не можете сила это для того, чтобы встроить что угодно.Если вы используете Visual C ++, включите "встроить любой подходящий", "генерация кода во время соединения" и "предпочитайте быстрый код".