![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| lxx |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 1.6.2008 Репутация: нет Всего: нет |
Приветствую!
Есть void* с переменной класса типа этого:
Можно-ли получить из этого войда содержимое переменной data_, не объявляя самого класса и не кастуя войд в него? Есть предположение, что можно это сделать как-то так по смещению:
Но как вычислить это смещение? Это сообщение отредактировал(а) lxx - 25.7.2011, 21:38 |
||||
|
|||||
| VirtualVoid |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 4.8.2009 Где: Сибирь Репутация: нет Всего: 1 |
Наверно, не скомпилится. Нужно хотя-бы так:
Т.е. сначала кастуем, а потом, зная размер содержимого указателя(в нашем случае char), компилятор сможет прибавить целое число к указателю. Если не кастануть до прибавления, то откуда компилятору знать, сколько прибавлять к этому указателю? Ведь когда мы пишем:
То указатель сдвигается на sizeof(T)*n адресуемых ячеек (байты на популярных архитектурах), а sizeof(void) не определен. Но зачем всё это? Это же небезопасно и жутко непереносимо! Результат может различаться даже при компиляции разными компиляторами на одной архитектуре. Хотя.. смещение можно попробовать вычислить в рантайме примерно так:
Но все-равно это бред, особенно учитывая, что компиляторы любят выравнивания, а здесь еще присутствует наследование от шаблонного(!) класса. |
||||||
|
|||||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Есть стандартный макрос offsetof который как раз и возвращает смещение поля в структуре. gcc на применение такого макроса к классам (не POD) вопит благим матом, и видимо не зря
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |