Объектный код сгенерирован для неиспользованных методов шаблонного класса?

Решение

Я нашел то, что мне не хватало. Я забыл добавить

@section Scripts {
<partial name="_ValidationScriptsPartial" />
}

внизу просмотра.

12
задан hsivonen 8 October 2008 в 14:41
поделиться

3 ответа

Виртуальные функции членства инстанцируют, когда шаблон класса инстанцируют, но невиртуальные функции членства инстанцируют, только если их называют.

Это покрыто [temp.inst] в стандарте C++ (В C++ 11, это - §14.7.1/10. В C++ 14, это - §14.7.1/11, и в C++ 17 это - §17.7.1/9. Выборка от C++ 17 ниже)

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

Также обратите внимание, что возможно инстанцировать шаблона класса, даже если некоторые функции членства не instantiable для данных шаблонных параметров. Например:

template <class T>
class Xyzzy
{
public:
    void CallFoo() { t.foo(); }  // Invoke T::foo()
    void CallBar() { t.bar(); }  // Invoke T::bar()

private:
    T t;
};

class FooBar
{
public:
    void foo() { ... }
    void bar() { ... }
};

class BarOnly
{
public:
    void bar() { ... }
};

int main(int argc, const char** argv)
{
    Xyzzy<FooBar>  foobar;    // Xyzzy<FooBar> is instantiated
    Xyzzy<BarOnly> baronly;   // Xyzzy<BarOnly> is instantiated

    foobar.CallFoo();         // Calls FooBar::foo()
    foobar.CallBar();         // Calls FooBar::bar()

    baronly.CallBar();        // Calls BarOnly::bar()

    return 0;
}

Это допустимо, даже при том, что Xyzzy:: CallFoo () не instantiable, потому что нет такой вещи как BarOnly:: нечто (). Эта функция часто используется как шаблонный инструмент метапрограммирования.

Обратите внимание, однако, что "инстанцирование" шаблона непосредственно не коррелирует к тому, сколько объектного кода сгенерировано. Это будет зависеть от Вашей реализации компилятора/компоновщика.

23
ответ дан 2 December 2019 в 05:56
поделиться

Я думаю, что это зависит от компилятора и настроек. Например, я полагаю, что MSVC6 генерировал все, но VS2005 не делает. Спецификация говорит, что компилятор не должен, но в реальном мире, это зависит от фактического компилятора (существует много обходных решений в повышении для MSVC6, например). Компоновщик может удалить не имеющие ссылки функции, если/opt:ref включен (для VS, эквивалентные опции существуют для других компиляторов).

2
ответ дан 2 December 2019 в 05:56
поделиться

Обычно, да.

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

Тем не менее, если рассматриваемые методы не являются виртуальными, и никогда не называются, компоновщик может удалить их с его нормальными функциями удаления мертвого кода. Так сгенерированный (и скомпилированный) код не будет в заключительном EXE.

Также это будет в основном зависеть от компилятора C++, используемого, потому что они не являются всеми одинаковыми.

1
ответ дан 2 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: