Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
1

Union с явными указателями или void*- что выбрать?

01.08.2012, 01:19. Просмотров 1696. Ответов 10
Метки нет (Все метки)

В программе предполагается использование огромного количества указателей типа void*, по которым будут хранится объекты типов А и Х. Т.о. при обращении будет использоваться явное приведение типа указателя. Но как вариант рассматриваю вместо void* использовать
C++
1
2
3
4
5
union
{
    A* pA;
    X* pX;
};
Мне кажется, что и тот, и другой вариант должны быть одинаковы по части занимаемого объёма памяти и временных задержек при обращении к объектам. Однако, вдруг есть какие-то неочевидные моменты?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.08.2012, 01:19
Ответы с готовыми решениями:

Void vs bool или что то похожие
Доброе время суток! Вопрос в общем про теорию и как правильно програмить по феншую! Допустим...

Что возвращает void, или различие между процедурами и функциями
Здраствуйте, пару месяцев назад, когда я бегал по собеседованиям, меня интерьювер спросил разницу...

Void menu(void); что это ? почему не void menu();
void menu(void); что это ? почему не void menu(); void naprimer(void); и это идет в классе это...

delete или new (typeid(void*))(void*)
Доброе время суток. Пишу список. Телом каждого элемента (el) списка является void указатель(body)....

10
Каратель
Эксперт С++
6593 / 4014 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
01.08.2012, 01:33 2
мембером юниона могут быть только POD-типы (так было до выхода нового стандарта - С++11, в каком из компиляторов эта фича уже реализована - не знаю)
0
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
01.08.2012, 01:40  [ТС] 3
У меня это работает, т.к. MS Visual Studio 2010 поддерживает многое из C++11. Активно пользуюсь такой штукой, как auto, например.
Вопрос открыт.
0
Jupiter
01.08.2012, 01:53
  #4

Не по теме:

Цитата Сообщение от vampir64 Посмотреть сообщение
У меня это работает
пардон туплю, указатели и есть POD-ы, потому и работает)

0
бжни
2467 / 1676 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
01.08.2012, 01:57 5
Цитата Сообщение от vampir64 Посмотреть сообщение
В программе предполагается использование огромного количества указателей типа void*, по которым будут хранится объекты типов А и Х. Т.о. при обращении будет использоваться явное приведение типа указателя. Но как вариант рассматриваю вместо void* использовать
void* в с++ достаточно нечасто используется, потому как это явное ослабление типизации времен си
ну это так, к слову

не очень понятное преимущество перед использованием такого union'а
union'ы обычно используют там, где по содержимому самого union'а можно определить какое его поле используется
0
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
01.08.2012, 02:07  [ТС] 6
За типизацией услежу, т.к. код малюсенький и надёжно изолирован кнутри класса.

Преимущество union'а - отсутствие необходимости делать каждый раз static_cast. Используй нужный указатель - и всё тут. Очень удобно. А знать, какое именно поле нужно использовать - не проблема в моём случае.

Посему, вопрос производительности и эффективного использования памяти открыт.
0
~ Эврика! ~
1253 / 1002 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
01.08.2012, 02:14 7
Выбрать лучше то, в чём сам не запутаешься, пытаясь разобраться, что это творится в коде, недельки через две. То есть явное приведение типов, которое читается однозначно.

Фактически да, оно где-то так (плюс поправка на виртуальные функции) и происходит при приведении типов туда-сюда между родственными классами. Только dynamic_cast делает ещё проверку (в рантайме), что всё точно-точно окей. reinterpret_cast не делает, как и обычный C-style каст (X*)something.

Конечно, запись foobar.asX читается приятнее, чем reinterpret_cast<X*>(foobar), но по-хорошему второй вариант является такой себе большой меткой «может случиться беда, если foobar не является X, будь предельно внимателен». Особенно, когда её приходится писать каждый раз. В идеале, конечно, лучше бы вообще от этого и всяких void* избавиться.

Лучше оставить union для более очевидного применения — всяких а-ля динамических типов: Any/DynamicAny/Variant/как-его-там-ещё-называют.
1
бжни
2467 / 1676 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
01.08.2012, 02:16 8
Цитата Сообщение от vampir64 Посмотреть сообщение
Посему, вопрос производительности и эффективного использования памяти открыт.
проблем тогда никаких
в использовании union'ов для этого случая нет никакого overhead'a
1) по памяти будет занимать ровно один указатель
2) производительность не упадет, так как в с/с++ при обращении к union'у компилятор в compile-time знает к какому из полей
1
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
01.08.2012, 02:29  [ТС] 9
Спасибо за ответы. В принципе, для меня тема исчерпана. Ещё немного взвешу все за и против, и реализую то, что хотел. А всётаки "мозолящий глаз" reinterpret_cast - интересный вариант...
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
01.08.2012, 07:17 10
reinterpret_cast не делает, как и обычный C-style каст (X*)something.
Не совсем все же. (X*) something пытается сделать сначала static_cast и если не получается использует reinterpret.
1
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
01.08.2012, 09:27  [ТС] 11
А меж тем... Логика ~OhMyGodSoLong~ мне очень понравилась, поэтому... Выбираю union Проект - самоделка, есть простор для экспериментов; если позже всплывут проблемы, будет мне урок.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2012, 09:27

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Что значит void(*f)()=(void(*)()func?
void(*f)()=(void(*)())func; Объясните, пожалуйста, что значит этот код.

Что выбрать - Amd a8 3530mx или intel core i5 2450 или i7 2670qm?
Добрый день помогите выбрать процессор что мне лучше выбрать Amd a8 3530mx или intel core i5 2450...

Что выбрать на данный момент, что рекомендуете: Веб или Андроид?
Что рекомендуете, Андроид или Веб, какая сфера лучше(обе заходят), нравится и разаботка...

Что лучше С++ 6 или С++ 2010 Что выбрать, мое мнение
Что лучше С++ 6 или С++ 2010 Что выбрать, мое мнение Вот я тут на днях думал и пришел к выводу,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.