Вычет аргумента шаблона Variadic - c ++ 11 - множество функций связаны с одним - PullRequest
0 голосов
/ 07 мая 2018

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

Итак, у меня есть одна функция, которая выглядит следующим образом:

template <typename T, typename F, typename ... Args> 
static T Func( std::string str, Args&& ... args )
{
 ... Do something
}

Затем я вызываю эту функцию несколько раз из разных мест, где в большинстве случаев передаваемые типы различны. Но когда я отлаживаю это, когда я ищу символ Func, я получаю, что один и тот же адрес функции имеет несколько разных символов:

00000000`70ba4ae0 Func<unsigned long,unsigned long (__stdcall*)(wchar_t const *),wchar_t const *>

00000000`70ba4ae0 Func<void *,void * (__stdcall*)(unsigned int),unsigned int>

00000000`70ba4ae0 Func<int,int (__stdcall*)(void *),void *>

Так что все они в основном одинаковые функции. Когда я пытаюсь позвонить, например:

call Func<void *,void * (__stdcall*)(unsigned int),unsigned int>

В отладчике вижу:

call Func<int,int (__stdcall*)(void *),void *>

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

Хотя я могу понять, почему это может произойти, но есть ли способ заставить каждую функцию быть автономной?

1 Ответ

0 голосов
/ 12 мая 2018

Проблема заключалась в сворачивании COMDAT.Отключение флагов OPT: ICF и OPT: REF сделали свое дело.Хотя стоит отметить, что компиляция с VS 2017 с флагами дала более «разумные» результаты, чем компиляция того же кода с VS 2013.

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