Указатели функций-членов и наиболее быстрые делегаты C++ - Реализации указателей функций-членов
ОГЛАВЛЕНИЕ
Реализации указателей функций-членов
Как компиляторы обычно реализуют указатели функций-членов? Ниже приведены результаты, полученные путем применения оператора sizeof к различным структурам (int, указатель данных void *, указатель кода (то есть, указатель на статическую функцию), и указатель функции-члена класса с единичным, множественным, виртуальным наследованием или неизвестным (т.е., предваряющее объявление)) для различных 32, 64 и 16-битных компиляторов.
Компилятор | Параметры | int | DataPtr | CodePtr | Single | Multi | Virtual | Unknown |
MSVC |
| 4 | 4 | 4 | 4 | 8 | 12 | 16 |
MSVC | /vmg | 4 | 4 | 4 | 16# | 16# | 16# | 16 |
MSVC | /vmg /vmm | 4 | 4 | 4 | 8# | 8# | -- | 8 |
Intel_IA32 |
| 4 | 4 | 4 | 4 | 8 | 12 | 16 |
Intel_IA32 | /vmg /vmm | 4 | 4 | 4 | 4 | 8 | -- | 8 |
Intel_Itanium |
| 4 | 8 | 8 | 8 | 12 | 16 | 20 |
G++ |
| 4 | 4 | 4 | 8 | 8 | 8 | 8 |
Comeau |
| 4 | 4 | 4 | 8 | 8 | 8 | 8 |
DMC |
| 4 | 4 | 4 | 4 | 4 | 4 | 4 |
BCC32 |
| 4 | 4 | 4 | 12 | 12 | 12 | 12 |
BCC32 | /Vmd | 4 | 4 | 4 | 4 | 8 | 12 | 12 |
WCL386 |
| 4 | 4 | 4 | 12 | 12 | 12 | 12 |
CodeWarrior |
| 4 | 4 | 4 | 12 | 12 | 12 | 12 |
XLC |
| 4 | 8 | 8 | 20 | 20 | 20 | 20 |
DMC | small | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
| medium | 2 | 2 | 4 | 4 | 4 | 4 | 4 |
WCL | small | 2 | 2 | 2 | 6 | 6 | 6 | 6 |
| compact | 2 | 4 | 2 | 6 | 6 | 6 | 6 |
| medium | 2 | 2 | 4 | 8 | 8 | 8 | 8 |
| large | 2 | 4 | 4 | 8 | 8 | 8 | 8 |
# Или 4,8, или 12, если ключевое слово __single/ __multi/ __virtual_inheritance используется.
Компиляторы - Microsoft Visual C++ 4.0 до 7.1 (.NET 2003), GNU G++ 3.2 (исполняемые файлы MingW, http://www.mingw.org/), Borland BCB 5.1 (http://www.borland.com/), Open Watcom (WCL) 1.2 (http://www.openwatcom.org/), Digital Mars (DMC) 8.38n (http://www.digitalmars.com/), Intel C++ 8.0 for Windows IA-32, Intel C++ 8.0 для Itanium (http://www.intel.com/), IBM XLC для AIX (Power, PowerPC), Metrowerks Code Warrior 9.1 для Windows (http://www.metrowerks.com/) и Comeau C++ 4.3 (http://www.comeaucomputing.com/). Данные для Comeau применимы для всех поддерживаемых ими 32-битных платформ (x86, Alpha, SPARC, и т.д.). 16-битные также были протестированы в 4ч конфигурациях DOS (крошечная, компактная, средняя и большая), чтобы показать влияние указателей данных и кода различных размеров. MSVC также был проверен с параметром (/vmg), который дает "полную универсальность для указателей на члены". (Если у вас есть компилятор от производителя, который не упомянут здесь, сообщите нам. Результаты для процессоров не-x86 особенно важны.)
Посмотрев на эту таблицу, вы можете без труда увидеть, как легко написать код, который будет работать в одних обстоятельствах, но не будет компилироваться в других. Внутренние реализации сильно различаются в разных компиляторах; кстати, вряд ли какая-либо другая возможность языка имеет такое разнообразие реализаций. Детальное изучение реализаций открывает нечто неожиданно отвратительное.