Оба; вид.
Фактические инструкции на самом деле не отличаются для Windows и Linux, поскольку они скомпилированы для архитектуры с одним процессором (x86).
Однако двоичный файл - это больше, чем просто код, работающий на голом оборудовании. Например, он также содержит информацию, которая сообщает операционной системе, как загрузить исполняемый файл и его зависимости. Двоичный файл упакован в определенном формате. Этот формат может быть различным в разных операционных системах.
Кроме того, операционная система предоставляет приложениям некоторые сервисы (через системные вызовы и API). Услуги, предоставляемые операционными системами, и способы их использования различаются в зависимости от операционной системы.
Эти причины способствуют тому, что большую часть времени собственный двоичный файл зависит как от архитектуры ОС, так и от архитектуры процессора, для которой он скомпилирован.
Ответ на обновленный вопрос:
Стандарт C ++ не требует ничего о природе скомпилированной цели. Он просто определяет требования совместимости на уровне источника. Следовательно, если вы будете придерживаться стандартных библиотек, вы сможете использовать тот же исходный код для компиляции на платформах, которые предлагают соответствующую реализацию C ++. Стандарт ничего не говорит о бинарной переносимости. Как я упоминал выше, примитивные системные вызовы, которые предоставляют операционные системы, могут различаться, и фактическая реализация стандартной библиотеки зависит от того, как ОС выполняет эти системные вызовы.
Чтобы запустить двоичный файл Windows в Linux, вам необходимо использовать какую-то эмуляцию, например Wine, которая понимает двоичный формат Windows и имитирует Windows API для приложений.