Указатели функций-членов и наиболее быстрые делегаты C++ - Заключение

ОГЛАВЛЕНИЕ

Переносимость

Так как делегаты основаны на поведении, не определенном стандартами, мы тщательно проверяли код во множестве компиляторов. Это в большей степени переносимый, чем стандартный код, так как многие компиляторы не полностью подчиняются стандартам. Широкая известность делает их безопасными. Ведущие производители компиляторов и несколько членов комитета о стандартах C++ знакомы с методами, представленными здесь (во многих случаях ведущие производители компиляторов связались со мной по поводу статьи). Есть незначительный риск, что производители выполнят такое изменение, которое непоправимо разрушит код. Например, никакие изменения не нужны для обеспечения поддержки первых 64-битных компиляторов Microsoft. Codeplay даже использовал FastDelegates для внутреннего тестирования своего компилятора VectorC.

Реализация FastDelegate была протестирована в Windows, DOS, Solaris, BSD и в нескольких разновидностях Linux, при этом использовались x86, AMD64, Itanium, SPARC, MIPS, виртуальные машины.NET и некоторые встроенные процессоры. Следующие компиляторы успешно прошли испытание:

  • Microsoft Visual C++ 6.0, 7.0 (.NET), 7.1 (.NET 2003) и 8.0 (2005) Beta (включая /clr 'управляемый C++').
  • {Скомпилированы и скомпонованы, также проверен ассемблерный код, но не запущены} Microsoft 8.0 Beta 2 для Itanium и для AMD64.
  • GNU G++ 2.95, 3.0, 3.1, 3.2 и 3.3 (Linux, Solaris и Windows (MingW, DevCpp, Bloodshed)).
  • Borland C++ Builder 5.5.1 и 6.1.
  • Digital Mars C++ 8.38 (x86, 32-битный и 16-битный, Windows все модели памяти DOS).
  • Intel C++ для Windows (x86) 8.0 и 8.1.
  • Metrowerks CodeWarrior для Windows 9.1 (в режимах C++ и EC++).
  • CodePlay VectorC 2.2.1 (Windows, Playstation 2). Ранние версии не поддерживаются.
  • Portland Group PGI Workstation 5.2 for Linux, 32-bit.
  • { Скомпилированы и скомпонованы, также проверен ассемблерный код, но не запускаются} Comeau C++ 4.3 (x86 NetBSD).
  • { Скомпилированы и скомпонованы, также проверен ассемблерный код, но не запускаются} Intel C++ 8.0 и 8.1 для Itanium, Intel C++ 8.1 для EM64T/AMD64.

Ниже описано состояние других компиляторов C++, которые, как мы знаем, все еще используются:

  • Open Watcom WCL: Будет работать, как только шаблоны функций-членов будут добавлены в компилятор. Ядро кода (преобразование между указателями функций-членов) работает в WCL 1.2.
  • LVMM: Ядро кода работает, но в данный момент компилятор имеет слишком много ошибок.
  • IBM Visual Age и XLC: Должно работать, так как IBM заявляет, что есть 100% совместимость на уровне двоичного кода с GCC.
  • Pathscale EKO: Должно работать, так как совместим на двоичном уровне с GCC.
  • Все компиляторы, использующие синтаксический анализатор EDG (GreenHills, Apogee, WindRiver, etc.), также должны работать.
  • Paradigm C++: Неизвестно, но кажется, что это просто перекомпонованная ранняя версия компилятора Borland.
  • Sun C++: Неизвестно.
  • Compaq CXX: Неизвестно.
  • HP aCC: Неизвестно.

Заключение

Начав объяснение с нескольких строк кода, мы написали в итоге огромное руководство по неясной части языка. Мы также выявили незарегистрированные ошибки и несовместимости в шести популярных компиляторах. Это слишком большой объем работы для двух строк ассемблерного кода!

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

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