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

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

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

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

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

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

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

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

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

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

Что выбрать C++ или C#? - C++
А C# нормальный язык или только для Windows и этой .NET или на нем можно писать нормальние кросплатформенные приложения и низкоуровневые...

Шилдт или Стивен Прата: что выбрать? - C++
Недавно закончил вводный курс от Яндекс по C++. Хотел бы дальше продолжить изучать язык. В интернете нарыл, что хвалят учебник Шилда...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.08.2012, 01:33 #2
мембером юниона могут быть только POD-типы (так было до выхода нового стандарта - С++11, в каком из компиляторов эта фича уже реализована - не знаю)
0
vampir64
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
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
01.08.2012, 01:57 #5
Цитата Сообщение от vampir64 Посмотреть сообщение
В программе предполагается использование огромного количества указателей типа void*, по которым будут хранится объекты типов А и Х. Т.о. при обращении будет использоваться явное приведение типа указателя. Но как вариант рассматриваю вместо void* использовать
void* в с++ достаточно нечасто используется, потому как это явное ослабление типизации времен си
ну это так, к слову

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

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

Посему, вопрос производительности и эффективного использования памяти открыт.
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 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
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
01.08.2012, 02:16 #8
Цитата Сообщение от vampir64 Посмотреть сообщение
Посему, вопрос производительности и эффективного использования памяти открыт.
проблем тогда никаких
в использовании union'ов для этого случая нет никакого overhead'a
1) по памяти будет занимать ровно один указатель
2) производительность не упадет, так как в с/с++ при обращении к union'у компилятор в compile-time знает к какому из полей
1
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
01.08.2012, 02:29  [ТС] #9
Спасибо за ответы. В принципе, для меня тема исчерпана. Ещё немного взвешу все за и против, и реализую то, что хотел. А всётаки "мозолящий глаз" reinterpret_cast - интересный вариант...
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
01.08.2012, 07:17 #10
reinterpret_cast не делает, как и обычный C-style каст (X*)something.
Не совсем все же. (X*) something пытается сделать сначала static_cast и если не получается использует reinterpret.
1
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
01.08.2012, 09:27  [ТС] #11
А меж тем... Логика ~OhMyGodSoLong~ мне очень понравилась, поэтому... Выбираю union Проект - самоделка, есть простор для экспериментов; если позже всплывут проблемы, будет мне урок.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2012, 09:27
Привет! Вот еще темы с ответами:

Что выбрать: mfc, api, winforms,qt или перейти на с#? - C++
Подскажите пожалуйста, я взялся за изучение с++ теперь стал выбор mfc, api, winforms,qt или перейти на с#. Программы в будущем хотел бы...

Что выбрать: пользовательский цикл или стандартный алгоритм с предикатом - C++
Всем привет. Рассмотрим код (C++03, не C++11): #include &lt;algorithm&gt; #include &lt;iostream&gt; #include &lt;iterator&gt; #include &lt;list&gt; ...

Union что из себя представляет? - C++
Читал много книг и там про него не чего не было сказано, парни объясните мне пожалуйста для чего он?

В этой части кода происходит объявление функций? Что такое void? Что в скобках? - C++
В этой части кода происходит объявление функций? Что такое void? Что в скобках? void get(float **mas, int N, int M); void...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.08.2012, 09:27
Ответ Создать тему
Опции темы

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