Может ли какой-нибудь основной компилятор поддерживать неограниченные объединения C ++ 0x в ближайшем будущем? - PullRequest
7 голосов
/ 10 июля 2010

Я продолжаю искать, но кажется, что разработчики компиляторов не заинтересованы в их поддержке.

Мне это кажется странным - в основном, текущий C ++ имеет ограничения на союзы, которые всегда были раздражением и никогда не были уместны. Можно подумать, что удаление нескольких проверок на ошибки было бы относительно простым способом пометить дополнительный блок поддержки c ++ 0x, но, к сожалению, ни один разработчик компилятора этого не сделал.

Меня интересует то, что он обеспечивает простое решение повторяющейся проблемы кодирования структуры данных - как зарезервировать память для экземпляра некоторого неизвестного типа (параметра шаблона), предпочтительно с максимально возможной безопасностью типов в обстоятельства, но без вызова какого-либо конструктора, который, как оказалось, определен для этого типа. Действительно важным моментом является то, что правила выравнивания должны соблюдаться.

Для этого идеально подходит неограниченное объединение - оно дает вам тип, у которого нет конструкторов или деструкторов, но который имеет правильный размер и выравнивание, чтобы разрешить любой элемент. Есть, конечно, способы явного конструирования и разрушения, когда это необходимо, и когда вам нужен типобезопасный доступ, вы просто используете соответствующий член объединения для доступа к нему. Поддержка "правильных" союзов также может быть полезна, но вы получаете огромные преимущества даже для одного члена профсоюза, такого как ...

union Memory_For_Item_t
{
  Item_t  m_Item;
};

Даже с использованием стандартизированных функций обработки выравнивания в C ++ 0x этот подход выигрывает для удобства и безопасности, например, когда. Вы хотите пространство для x элементов в узле, не все из которых будут использоваться (или создаваться) в любое время. Без C ++ 0x мы все еще находимся в нерешительности с проблемами выравнивания WRT - каждый компилятор делает это по-своему нестандартно.

Единственная проблема с неограниченными профсоюзами - я не могу их найти.

Ответы [ 3 ]

4 голосов
/ 10 июля 2010

ближайшее будущее?Я бы на это не рассчитывал.Поскольку http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport выглядит хорошо, ни один из текущих компиляторов не поддерживает его, даже несмотря на то, что реализуются многие функции C ++ 0x.

Однако, как объясняет N2544:

Текущий способ обойти ограничения объединения состоит в создании поддельного объединения с использованием шаблонного программирования или приведений.

Итак, ситуация, которую вы описываете, вероятно, уже имеет решение, хотя и немного грязное.

3 голосов
/ 20 июля 2010

GCC теперь отображает список поддерживаемых в версии 4.6 . Кажется, он был представлен 14 июля с этим патчем . Будущее сейчас.

1 голос
/ 10 июля 2010

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

Почему бы вам просто не использовать boost :: option ? если вы не собираетесь использовать boost и уже используете C ++ 0x, используйте черты типа, такие как std::alignment_of/std::aligned_storage, которые стандартизированы и кроссплатформенны, и если ваш компилятор теперь поддерживает их, вы можете использовать шаблоны с переменным числом аргументов. Используйте шаблонное метапрограммирование для вычисления самого большого типа в списке типов и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...