Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

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

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

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

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

Union что из себя представляет? C++
delete или new (typeid(void*))(void*) C++
Что выбрать C++ или C#? C++
C++ Что лучше С++ 6 или С++ 2010 Что выбрать, мое мнение
C++ Что значит void(*f)()=(void(*)()func?
Что выбрать: пользовательский цикл или стандартный алгоритм с предикатом C++
Пользовательские типы в union - Нужно ли инстализировать как-то String, Object или Array? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.08.2012, 01:33     Union с явными указателями или void*- что выбрать? #2
мембером юниона могут быть только POD-типы (так было до выхода нового стандарта - С++11, в каком из компиляторов эта фича уже реализована - не знаю)
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
01.08.2012, 01:40  [ТС]     Union с явными указателями или void*- что выбрать? #3
У меня это работает, т.к. MS Visual Studio 2010 поддерживает многое из C++11. Активно пользуюсь такой штукой, как auto, например.
Вопрос открыт.
Jupiter
01.08.2012, 01:53
  #4

Не по теме:

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

alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
01.08.2012, 01:57     Union с явными указателями или void*- что выбрать? #5
Цитата Сообщение от vampir64 Посмотреть сообщение
В программе предполагается использование огромного количества указателей типа void*, по которым будут хранится объекты типов А и Х. Т.о. при обращении будет использоваться явное приведение типа указателя. Но как вариант рассматриваю вместо void* использовать
void* в с++ достаточно нечасто используется, потому как это явное ослабление типизации времен си
ну это так, к слову

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

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

Посему, вопрос производительности и эффективного использования памяти открыт.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.08.2012, 02:14     Union с явными указателями или void*- что выбрать? #7
Выбрать лучше то, в чём сам не запутаешься, пытаясь разобраться, что это творится в коде, недельки через две. То есть явное приведение типов, которое читается однозначно.

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

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

Лучше оставить union для более очевидного применения — всяких а-ля динамических типов: Any/DynamicAny/Variant/как-его-там-ещё-называют.
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
01.08.2012, 02:16     Union с явными указателями или void*- что выбрать? #8
Цитата Сообщение от vampir64 Посмотреть сообщение
Посему, вопрос производительности и эффективного использования памяти открыт.
проблем тогда никаких
в использовании union'ов для этого случая нет никакого overhead'a
1) по памяти будет занимать ровно один указатель
2) производительность не упадет, так как в с/с++ при обращении к union'у компилятор в compile-time знает к какому из полей
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
01.08.2012, 02:29  [ТС]     Union с явными указателями или void*- что выбрать? #9
Спасибо за ответы. В принципе, для меня тема исчерпана. Ещё немного взвешу все за и против, и реализую то, что хотел. А всётаки "мозолящий глаз" reinterpret_cast - интересный вариант...
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
01.08.2012, 07:17     Union с явными указателями или void*- что выбрать? #10
reinterpret_cast не делает, как и обычный C-style каст (X*)something.
Не совсем все же. (X*) something пытается сделать сначала static_cast и если не получается использует reinterpret.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2012, 09:27     Union с явными указателями или void*- что выбрать?
Еще ссылки по теме:

Что выбрать: mfc, api, winforms,qt или перейти на с#? C++
Void vs bool или что то похожие C++
C++ Что такое stract pragma и union
Что не так с этими указателями? C++
Хранение гетерогенных данных - union или полиморфизм C++

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

Или воспользуйтесь поиском по форуму:
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
01.08.2012, 09:27  [ТС]     Union с явными указателями или void*- что выбрать? #11
А меж тем... Логика ~OhMyGodSoLong~ мне очень понравилась, поэтому... Выбираю union Проект - самоделка, есть простор для экспериментов; если позже всплывут проблемы, будет мне урок.
Yandex
Объявления
01.08.2012, 09:27     Union с явными указателями или void*- что выбрать?
Ответ Создать тему
Опции темы

Текущее время: 05:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru