Встраивает ли встроенная сборка в мобильность? - PullRequest
4 голосов
/ 31 июля 2010

Предположим, вы написали переносимый код C ++, который без проблем работает на разных платформах. Чтобы внести некоторые изменения для оптимизации производительности, вы используете встроенную сборку внутри вашего кода. Это хорошая практика (без оптимизации компилятора) или это создаст проблемы с переносимостью?

Ответы [ 4 ]

13 голосов
/ 31 июля 2010

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

6 голосов
/ 31 июля 2010

Очевидно, что встроенная сборка даже близко не подходит для переноски. Чтобы вообще поддерживать переносимость, вы обычно должны использовать #ifdef (или что-то в этом порядке), чтобы определить, когда его вообще использовать.

Я предпочитаю разделить язык ассемблера на отдельный файл и в make-файле решить, создавать ли переносную версию или версию на языке ассемблера.

2 голосов
/ 31 июля 2010

Другой очевидный выбор - реализовать встроенную сборку только на определенных архитектурах и сохранить исходный (неоптимизированный) C ++ для любой другой архитектуры, а не пытаться генерировать сборку для всех архитектур. (Конечно, #ifdefed, конечно.) Тогда вы получаете выгоду от оптимизации на одной архитектуре с базовыми функциями на всех.

Однако, когда мы делали это в проектах, над которыми я работал в прошлом, это было худшее, что нужно было поддерживать - какой-то другой фрагмент кода изменился бы, и именно то, что передавалось в изолированные функции. ) изменится, и оригинальный C ++ и сборка больше не будут совпадать, и было много воплей и скрежетов зубов.

2 голосов
/ 31 июля 2010

Это зависит.

Если у вас только сборка x86, ваше приложение никогда не будет работать на ARM и собственном x64.Чтобы решить эту проблему, вы можете окружить его символами # ifdef в зависимости от архитектуры.Это подход кроссплатформенных, высокооптимизированных библиотек, таких как h264.Однако в большинстве случаев это того не стоит.Просто используйте очень специфический C, и он будет вести себя очень похоже на нативную сборку.

...