Полезно ли делать библиотечные функции шаблонными, чтобы избежать инструкций компилятора? - PullRequest
2 голосов
/ 10 апреля 2019

Допустим, я создаю свою собственную библиотеку в пространстве имен l.Было бы полезно сделать как можно больше членов шаблонизированного пространства имен?Это побудило бы компилятор генерировать инструкции только для членов, которые фактически вызываются пользователем библиотеки.Чтобы прояснить мою точку зрения, я продемонстрирую ее здесь:

1)

namespace l{
    template <typename = void>
    int f() { return 3; }
}

против

2)

namespace l{
    int f() { return 3; }
}

Этоне вызывается в main, чтобы показать разницу.

int main() { return EXIT_SUCCESS; }

функция 1) не требует дополнительных инструкций для l::f():

main:
    push    rbp
    mov     rbp, rsp
    mov     dword ptr [rbp - 4], 0
    mov     eax, 0
    pop     rbp
    ret

функция 2) требует дополнительных инструкций дляl::f() (Если, опять же, l::f() не вызывается):

l::f()
    push    rbp
    mov     rbp, rsp
    mov     eax, 3
    pop     rbp
    ret
main:                                  
    push    rbp
    mov     rbp, rsp
    mov     dword ptr [rbp - 4], 0
    mov     eax, 0
    pop     rbp
    ret

1 Ответ

2 голосов
/ 10 апреля 2019

ТЛ; др

Полезно ли делать библиотечные функции шаблонными, чтобы избежать инструкций компилятора?

Нет. Выдача мертвого кода не является дорогой частью компиляции. Доступ к файлу, анализ и оптимизация (не обязательно в таком порядке) требуют времени, и эта идея заставляет клиентов библиотеки читать и анализировать больше кода, чем в обычной модели заголовок + библиотека.

Шаблоны обычно обвиняют в замедлении сборок, а не в их ускорении.


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

Общее время, потраченное на компиляцию, , вероятно, будет больше с шаблонной версией. Вы должны были бы составить профиль, чтобы быть уверенным (и я подозреваю, что f настолько мал, чтобы быть неизмеримым в любом случае), но мне трудно воспринимать это как полезное улучшение.

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

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