Указатели функций-членов и наиболее быстрые делегаты 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 особенно важны.)

Посмотрев на эту таблицу, вы можете без труда увидеть, как легко написать код, который будет работать в одних обстоятельствах, но не будет компилироваться в других. Внутренние реализации сильно различаются в разных компиляторах; кстати, вряд ли какая-либо другая возможность языка имеет такое разнообразие реализаций. Детальное изучение реализаций открывает нечто неожиданно отвратительное.