Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопросы по С++
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ig_z
1. Есть ли какая либо возможность узнать размер виртуальной таблицы методов для определенного класса?

2. Как можно задать нужный размер enum в байтах? Раньне думал, что определяя последний елемент подобным образом

typedef enum {ev1,ev2,ev3,evNone = 0xFFFF} TPacketMessage;

получаю размер 2 байта, но похоже, что это не так
dxp
Цитата(ig_z @ Apr 7 2006, 19:47) *
1. Есть ли какая либо возможность узнать размер виртуальной таблицы методов для определенного класса?


Средствами языка? Насколько знаю, нет, т.к. и сущности такой в языке нет - это технологическая вещь. Да и зачем? А если для интересу, то можно, во-первых, в листинге посмотреть, IAR, вроде, там показвает, сколько байтов резервирует для нее. Ну, и ее размер должен быть равен sizeof(указатель на функцию)*количество виртуальных функций.

Цитата(ig_z @ Apr 7 2006, 19:47) *
2. Как можно задать нужный размер enum в байтах? Раньне думал, что определяя последний елемент подобным образом

typedef enum {ev1,ev2,ev3,evNone = 0xFFFF} TPacketMessage;

получаю размер 2 байта, но похоже, что это не так

Размер перечислимого типа зависит от реализации. Как правило, под него отводится минимальный целый тип, который может описать все значения. А сколько у Вас получилось в этом примере?
AndyBig
По идее, этот пример должен получиться или 8 или 16 байт размером.
ig_z
Цитата(dxp @ Apr 7 2006, 16:38) *
Цитата(ig_z @ Apr 7 2006, 19:47) *

1. Есть ли какая либо возможность узнать размер виртуальной таблицы методов для определенного класса?


Средствами языка? Насколько знаю, нет, т.к. и сущности такой в языке нет - это технологическая вещь. Да и зачем? А если для интересу, то можно, во-первых, в листинге посмотреть, IAR, вроде, там показвает, сколько байтов резервирует для нее. Ну, и ее размер должен быть равен sizeof(указатель на функцию)*количество виртуальных функций.

Цитата(ig_z @ Apr 7 2006, 19:47) *
2. Как можно задать нужный размер enum в байтах? Раньне думал, что определяя последний елемент подобным образом

typedef enum {ev1,ev2,ev3,evNone = 0xFFFF} TPacketMessage;

получаю размер 2 байта, но похоже, что это не так

Размер перечислимого типа зависит от реализации. Как правило, под него отводится минимальный целый тип, который может описать все значения. А сколько у Вас получилось в этом примере?



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

А вот енум в ИАР получился 2 байта, в МСВС - 4
Shamil
Цитата(ig_z @ Apr 7 2006, 20:47) *
Скажем у меня имеется два устройства и канал связи между ними. На одном конце я сериализую объект, в котором имеется указатель на функции члены. На другом конце выполняю десериализацию. Вот в этом месте хотелось бы выполнить проверку диапазона допустимости значений указателя на функции члены.

Указатель на функцию-член класса в другом устройстве может быть неверным,
т.к. распределение памяти под таблицы виртуальных методов, может не быть
одинаковым, по крайней мере надеяться на это рискованно.
Old1
Цитата(ig_z @ Apr 7 2006, 17:47) *
А вот енум в ИАР получился 2 байта, в МСВС - 4

В мануале на ИАР-овский компилятор встретилась такая фраза:
Цитата
ISO/ANSI C specifies that constants defined using the enum construction should be
representable using the type int.
Если МСВС это Microsoft Visual C++, то все логично: там тип int четыре байта. В ИАР-е переменная типа enum может занимать 1, 2 , 4 или 8 байт ( если разрешены extensions).
ig_z
Цитата(Shamil @ Apr 7 2006, 18:13) *
Цитата(ig_z @ Apr 7 2006, 20:47) *

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

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


В спешке в словосочетании "указатель на функции члены" все время пропускаю "вируальную". Указатель на виртуальную функцию есть индекс в таблице виртуальных методов. Именно "врожденное" свойство компилятора создавать таблицу (или массив) нужного размера без дополнительных усилий мне больше всего и нравится. Если бы еще добавить проверку допустимости значений указателя на виртуальные функции члены.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.