Внутренний вызов AtlComModuleRegisterServer имеет внешнюю связь, которая обычно не позволяет оптимизатору распространять значение bRegTypeLib по графу вызовов. Отчасти это может быть лучше объяснено при разборке.
Так DllInstall(...)
звонит CAtlDllModuleT::RegisterServer(0)
. Это начало проблемы:
push 0
call ?DllRegisterServer@?$CAtlDllModuleT@VCAtlTestModule@@@ATL@@QAEJH@Z
Скажем только ради аргументов, что компилятор проверил, что CAtlDllModuleT::DllRegisterServer
вызывается только один раз, и очень безопасно сдвинуть 0 / FALSE вниз еще на один уровень ... внешняя связь предотвращает отбрасывание AtlComModuleRegisterServer
. высокая стоимость (дублирование кода) и не допускает никакой дополнительной оптимизации всей программы. Вероятно, безопаснее сохранить подпись как есть и выручить пораньше с помощью обычного вызова cdecl ...
?DllRegisterServer@?$CAtlDllModuleT@VCAtlTestModule@@@ATL@@QAEJH@Z proc near
<trimmed>
push 0
push edx
push offset ATL::_AtlComModule
call _AtlComModuleRegisterServer@12
Этот код может быть улучшен по размеру за счет двух констант, но он, вероятно, будет стоить примерно столько же времени выполнения. Если производительность является проблемой, рассмотрите возможность явной установки порядка расположения , вы можете сохранить ошибку страницы.