Интенсивное использование шаблонов для мобильных платформ - PullRequest
10 голосов
/ 23 декабря 2010

Я пролистал книгу Андрея Александреску «Современный дизайн C ++», и она кажется интересной.Однако он очень широко использует шаблоны, и я хотел бы выяснить, следует ли этого избегать при использовании C ++ для разработки мобильных платформ (Brew MP, WebOS, iOS и т. Д.) Из соображений размера.

В SymbianВ ОС C ++ стандартное использование шаблонов не рекомендуется, сама ОС Symbian использует их, но использует идиому, известную как тонкие шаблоны, где базовая реализация выполняется в стиле C с использованием указателей void * с тонким шаблоном, наложенным поверх него, для достижения типа.безопасность.Причина, по которой они используют эту идиому в отличие от регулярного использования шаблонов, заключается именно в том, чтобы избежать вздутие кода.

Итак, каковы мнения (или факты) об использовании шаблонов при разработке приложений для мобильных платформ.

Ответы [ 5 ]

9 голосов
/ 23 декабря 2010

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

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

Многое в "Современном C ++ Design" и подобных книгах не приведет к раздутому коду, потому что большая его часть действительно предназначена для обеспечения безопасности типов и выполнения метапрограммирования во время компиляции, а не для генерации код.

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

5 голосов
/ 23 декабря 2010

Шаблоны не обязательно ведут к раздуванию кода.Если вы напишите шаблон функции или класса и создадите его для десятка различных типов, тогда да, вы получите много сгенерированного дублированного кода (возможно, в любом случае. Некоторые компиляторы могут объединять идентичные экземпляры обратно).

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

Взяв в качестве примера std::vector,тогда да, если вы используете vector<int> и vector<float>, вы получите две копии некоторого кода.Но с шаблонами компилируется только код, который на самом деле используется .Функции-члены, которые вы никогда не вызываете, не будут генерировать никакого кода, и даже в функциях, которые скомпилированы, компилятор может удалить много кода.Например, для некоторых типов код обработки исключений может быть ненужным, поэтому компилятор может его исключить, получая меньший код, чем если бы вы использовали динамический полиморфизм, когда компилятор не смог бы создать любые предположения о типе хранимых.Таким образом, в этом вымышленном примере вы получите некоторый код, сгенерированный как для vector<int>, так и vector<float>, но каждый из них будет намного меньше, чем полиморфный вектор, как вы могли бы найтив Java, например.

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

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

2 голосов
/ 23 декабря 2010

Что бы вы ни делали, НЕ пытайтесь написать какой-либо код, скомпилируйте его и сравните размер исполняемого файла или дублирование кода.

1 голос
/ 23 декабря 2010

По моему личному опыту использование (и даже злоупотребление) шаблонов очень редко приводит к большому раздуванию кода, и компиляция с помощью -Os очень поможет.

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

Обычно размер данных (графика, аудио, ...) на несколько порядков больше, чем код. Так что я бы не волновался.

Конечно, могут быть исключения из того, что я сказал, но я думаю, что они в основном будут о продвинутом ( специальном / странном / сложные ) вещи, не относящиеся к самым обычным повседневным занятиям.

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

1 голос
/ 23 декабря 2010

Я бы сказал, что в общем случае (не только в связи с мобильной разработкой) этот совет держится.Некоторые из методов, описанных в Modern C ++ Design, могут привести к длительному времени сборки и раздуванию кода.

Это особенно верно при работе с «неясными» устройствами, такими как мобильные телефоны.Многие методики шаблонов полагаются на то, что компилятор и компоновщик отлично справляются с задачей устранения неиспользуемого / дублирующегося кода.Если этого не произойдет, вы рискуете сотнями повторяющихся std::vector экземпляров, разбросанных по всему коду.И поверьте мне, я видел, как это произошло.

Это не значит, что Modern C ++ Design - плохая книга или шаблоны плохие.Но особенно во встроенных проектах лучше следить, потому что он может кусаться.

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