Компиляция и запуск следующей простой программы отлично работает на моем компьютере разработчика (Visual Studio 2015, 64-разрядная версия).
Запуск одного и того же кода на другом компьютере приводит к сбою в диалоговом окне ошибки Windows, даже если установлены x64-redistributables (msvcp140.dll):
#include <memory>
#include <iostream>
int main(int argc, char **argv) {
std::shared_ptr<int> test; // comment out to run on both machines
std::cout << "Done: " << std::endl;
}
Удаление строки с общим указателем заставляет его работать.
Любая идея, в чем проблема может быть здесь, или как отлаживать?
Я нашел проблему, на случай, если это кому-нибудь пригодится:
В средстве просмотра событий Windows я обнаружил причину сбоя: исключение было 0xc000001d
или же illegal instruction
, Очевидно, мой код был скомпилирован с использованием /arch:AVX
флаг компиляции, приводящий к следующему коду для фрагмента выше:
int main(int argc, char **argv) {
00007FF749A816B0 sub rsp,48h
00007FF749A816B4 mov qword ptr [rsp+20h],0FFFFFFFFFFFFFFFEh
00007FF749A816BD vpxor xmm0,xmm0,xmm0
00007FF749A816C1 vmovdqu xmmword ptr [test],xmm0
std::shared_ptr<int> test; // comment out to run on both machines
std::cout << "Done: " << std::endl;
00007FF749A816C7 lea rdx,[string "Done: " (07FF749A86C70h)]
00007FF749A816CE mov rcx,qword ptr [__imp_std::cout (07FF749A8A0D8h)]
00007FF749A816D5 call std::operator<<<std::char_traits<char> > (07FF749A8107Dh)
...
Как видите, из-за /arch:AVX
vpxor
а также vmovdqu
были сгенерированы инструкции, которые не выполняются на слишком старых процессорах (например, на тех, которые я тестировал).
Решение состоит в том, чтобы иметь отдельные версии исполняемого файла (или отдельные пути через программу) с инструкциями AVX и без них для поддержки более старых процессоров.
Других решений пока нет …