|
|
  |
Вопросы по С++ |
|
|
|
Apr 7 2006, 13:38
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(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 байта, но похоже, что это не так Размер перечислимого типа зависит от реализации. Как правило, под него отводится минимальный целый тип, который может описать все значения. А сколько у Вас получилось в этом примере?
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Apr 7 2006, 14:47
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551

|
Цитата(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
|
|
|
|
|
Apr 7 2006, 15:13
|
Частый гость
 
Группа: Свой
Сообщений: 160
Регистрация: 23-12-04
Из: Уфа
Пользователь №: 1 631

|
Цитата(ig_z @ Apr 7 2006, 20:47)  Скажем у меня имеется два устройства и канал связи между ними. На одном конце я сериализую объект, в котором имеется указатель на функции члены. На другом конце выполняю десериализацию. Вот в этом месте хотелось бы выполнить проверку диапазона допустимости значений указателя на функции члены. Указатель на функцию-член класса в другом устройстве может быть неверным, т.к. распределение памяти под таблицы виртуальных методов, может не быть одинаковым, по крайней мере надеяться на это рискованно.
|
|
|
|
|
Apr 7 2006, 17:30
|

Знающий
   
Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095

|
Цитата(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).
|
|
|
|
|
Apr 8 2006, 00:41
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551

|
Цитата(Shamil @ Apr 7 2006, 18:13)  Цитата(ig_z @ Apr 7 2006, 20:47)  Скажем у меня имеется два устройства и канал связи между ними. На одном конце я сериализую объект, в котором имеется указатель на функции члены. На другом конце выполняю десериализацию. Вот в этом месте хотелось бы выполнить проверку диапазона допустимости значений указателя на функции члены.
Указатель на функцию-член класса в другом устройстве может быть неверным, т.к. распределение памяти под таблицы виртуальных методов, может не быть одинаковым, по крайней мере надеяться на это рискованно. В спешке в словосочетании "указатель на функции члены" все время пропускаю "вируальную". Указатель на виртуальную функцию есть индекс в таблице виртуальных методов. Именно "врожденное" свойство компилятора создавать таблицу (или массив) нужного размера без дополнительных усилий мне больше всего и нравится. Если бы еще добавить проверку допустимости значений указателя на виртуальные функции члены.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|