реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вопросы по С++
ig_z
сообщение Apr 7 2006, 12:47
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



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

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

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

получаю размер 2 байта, но похоже, что это не так
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 7 2006, 13:38
Сообщение #2


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 байта, но похоже, что это не так

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Apr 7 2006, 14:07
Сообщение #3


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



По идее, этот пример должен получиться или 8 или 16 байт размером.
Go to the top of the page
 
+Quote Post
ig_z
сообщение Apr 7 2006, 14:47
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Shamil
сообщение Apr 7 2006, 15:13
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 160
Регистрация: 23-12-04
Из: Уфа
Пользователь №: 1 631



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

Указатель на функцию-член класса в другом устройстве может быть неверным,
т.к. распределение памяти под таблицы виртуальных методов, может не быть
одинаковым, по крайней мере надеяться на это рискованно.
Go to the top of the page
 
+Quote Post
Old1
сообщение Apr 7 2006, 17:30
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 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).
Go to the top of the page
 
+Quote Post
ig_z
сообщение Apr 8 2006, 00:41
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



Цитата(Shamil @ Apr 7 2006, 18:13) *
Цитата(ig_z @ Apr 7 2006, 20:47) *

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

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


В спешке в словосочетании "указатель на функции члены" все время пропускаю "вируальную". Указатель на виртуальную функцию есть индекс в таблице виртуальных методов. Именно "врожденное" свойство компилятора создавать таблицу (или массив) нужного размера без дополнительных усилий мне больше всего и нравится. Если бы еще добавить проверку допустимости значений указателя на виртуальные функции члены.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 04:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01413 секунд с 7
ELECTRONIX ©2004-2016