Objective C.m / .mm различие в производительности?

К сожалению, вы можете указать только конструкцию в предложении where в этом экземпляре. Кажется странным, что вы не можете указать Int16, Int32 и т. Д., Но я уверен, что существует некоторая глубокая причина внедрения, лежащая в основе решения не допускать типы значений в предложении where.

Я предполагаю, что единственное решение должно выполнить проверку времени выполнения, которая, к сожалению, предотвращает проблему, возникающую во время компиляции. Это было бы похоже на: -

static bool IntegerFunction<T>(T value) where T : struct {
  if (typeof(T) != typeof(Int16)  &&
      typeof(T) != typeof(Int32)  &&
      typeof(T) != typeof(Int64)  &&
      typeof(T) != typeof(UInt16) &&
      typeof(T) != typeof(UInt32) &&
      typeof(T) != typeof(UInt64)) {
    throw new ArgumentException(
      string.Format("Type '{0}' is not valid.", typeof(T).ToString()));
  }

  // Rest of code...
}

Который немного уродлив, я знаю, но по крайней мере предоставляет требуемые ограничения.

Я также посмотрел бы на возможную производительность последствия для этой реализации, возможно, есть более быстрый выход.

29
задан Sam 23 February 2010 в 01:58
поделиться

2 ответа

Основным недостатком использования .mm по сравнению с .m для «нормального» Objective-C является то, что время компиляции значительно выше для Objective-C ++. Это потому, что компилятор C ++ занимает больше времени, чем компилятор C. С Xcode 3.2 и выше код Objective-C может использовать цепочку инструментов внешнего интерфейса Clang , чтобы значительно ускорить время компиляции Objective-C / C. Поскольку Clang еще не поддерживает Objective-C ++ / C ++, это еще больше увеличивает разрыв во времени компиляции между ними.

Лучшая стратегия - использовать .m по умолчанию. Если вам понадобится использовать Objective-C ++ на более поздних этапах разработки, нет ничего плохого в том, чтобы переименовать файл для использования расширения .mm. Если это так изнутри XCode, проект будет автоматически обновлен для использования вновь названного файла.

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

Для справки, вас также может заинтересовать этот ответ: C против C ++ (Objective-C против Objective-C ++) для iPhone

ОБНОВЛЕНИЕ 17 февраля 2012 г. Начиная с Xcode 4.0 (с LLVM 3.0), Clang поддерживает Objective-C ++. Даже поддержка C ++ 11 сейчас достаточно сильна.

45
ответ дан Community 20 November 2019 в 00:51
поделиться

Если вы используете только функции C, файлы .mm должны генерировать код, который работает очень похоже на .m

Также нет недостатка в переименовании файла позже .m в .mm, когда вам нужны функции C ++.

8
ответ дан rpetrich 20 November 2019 в 00:51
поделиться