2010-07-09 9 views
7

Ciągle szukam, ale wygląda na to, że nie ma żadnego oprocentowania od deweloperów kompilatorów.Czy jakikolwiek główny kompilator prawdopodobnie będzie obsługiwać nieograniczone związki C++ 0x w najbliższej przyszłości?

Dla mnie wydaje się to dziwne - zasadniczo obecne C++ ma ograniczenia dotyczące związków, które zawsze były irytujące i nigdy nie były odpowiednie. Można by pomyśleć, że zasadniczo usunięcie kilku sprawdzeń błędów byłoby stosunkowo prostym sposobem na zaznaczenie dodatkowego pola pomocy C++ 0x, ale AFAICT nie zrobił tego żaden twórca kompilatora.

Dlaczego jestem zainteresowany tym, że zapewnia on proste rozwiązanie powtarzającego się problemu w kodowaniu struktury danych - jak zarezerwować pamięć dla instancji jakiegoś nieznanego (typu szablonu), najlepiej z jak największym bezpieczeństwem typu w okoliczności, ale bez wywoływania jakiegokolwiek konstruktora, który został zdefiniowany na tym typie. Naprawdę ważne jest to, że należy przestrzegać zasad dostosowania.

Nieograniczony związek jest idealny do tego - daje typ, który nie ma konstruktorów ani destruktorów, ale który ma odpowiedni rozmiar i wyrównanie, aby pozwolić każdemu członkowi. Istnieją oczywiście sposoby jawnego konstruowania i niszczenia w razie potrzeby, a gdy potrzebujesz dostępu do typów, po prostu użyj odpowiedniego członka związku, aby uzyskać do niego dostęp. Wsparcie dla „właściwej” związki mogą być przydatne także, ale można dostać ogromne korzyści nawet dla unii pojedynczej członkowskich, takich jak ...

union Memory_For_Item_t 
{ 
    Item_t m_Item; 
}; 

Nawet przy standardowych funkcji obsługi wyrównanie w C++ 0x, to podejście wygrywa dla wygody i bezpieczeństwa, gdy np potrzebujesz miejsca na x elementów w węźle, z których nie wszystkie będą w użyciu (lub zbudowane) w dowolnym momencie. Bez C++ 0x, nadal jesteśmy w mrocznych czasach problemów z wyrównaniem WRT - każdy kompilator robi to w swój niestandardowy sposób.

Jedyny problem z nieograniczonymi związkami zawodowymi - nie ma dla nich pomocy, którą mogę znaleźć.

Odpowiedz

4

Niedaleka przyszłość? Nie liczyłbym na to. Ponieważ http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport dobrze się układa, żaden z obecnych kompilatorów nie obsługuje go, mimo że implementowane są liczne funkcje ponad C++ 0x.

Jednak jak N2544 wyjaśnia:

Obecny obejście ograniczeń związkowych jest stworzenie fałszywej jedności przy użyciu programowania szablon lub odlewane.

Tak więc, sytuacja, którą opisujesz, prawdopodobnie już ma rozwiązanie, choć trochę nieuporządkowane.

+0

Tak, teraz mam podejście szablonowe, ale polega ono na warunkach preprocesora w celu zidentyfikowania kompilatorów i innych złośliwości, głównie w celu prawidłowego traktowania wyrównania. IOW jest kruchy i ogólnie nieprzyjemny, a im wcześniej go zastąpię, tym lepiej. – Steve314

+0

Hmmm - interesujący stół, ale tylko z trzema zupełnie pustymi wierszami, jeden musi być dla funkcji, której najbardziej nie mogę się doczekać. No cóż - przypuszczam, że wyrazy i zamknięcia Lamdy będą miłe. – Steve314

1

Tak - mam teraz podejście szablonu, ale opiera się ona na preprocesora warunkowe zidentyfikować kompilatorów i inne obrzydliwości, głównie do obsługi dostać wyrównanie rację. IOW to kruchy i ogólnie nieprzyjemny

Dlaczego nie można po prostu użyć boost::variant? jeśli nie zamierzasz używać boost i już używasz C++ 0x, to użyj cech typu takich jak std::alignment_of/std::aligned_storage, które są standaryzowane i wieloplatformowe, a jeśli twój kompilator je obsługuje, możesz użyć szablonów variadic. Użyj meta-programowania szablonów, aby obliczyć największy typ na liście typów, itp.

+0

Mój wzorzec przedwcześnie pobudza :: wariant. Zastąpienie wszystkich zastosowań pewną funkcją doładowania lub funkcją C++ 0x, która nie jest idealna, a jedynie zastąpienie jej później, jest bezsensowne. Wcale nie używam C++ 0x - tylko czekam na możliwość korzystania z konkretnej funkcji. Na koniec "po prostu używaj wzmocnienia" nie jest tak naprawdę magiczną natychmiastową poprawką, którą możesz sobie wyobrazić - kolejnym problemem zależności itd. Jeśli miałby długoterminową wartość, to dobrze, ale jak to się stanie, będę dalej robił co Robię, dopóki nie pojawi się nieograniczony związek. – Steve314

+0

@ Steve314 to nie jest bezcelowe, to naprawdę zależy od tego, do czego używasz związków, jeśli zamierzasz używać go jako algebraicznego typu danych, czyli dyskryminowanego/oznaczonego związku, to wcale nie jest to bezużyteczne, ponieważ surowe (uogólnione)) związek nie jest przydatny do pracy z takim, jaki jest. Rzeczy takie jak boost :: variant tak samo użyteczne w C++ 0x bez względu na uogólnione związki czy nie. –

+0

@ Steve314 "Szukam sposobu zarezerwowania pamięci dla określonego typu bez wywoływania konstruktorów itp." Nie potrzebujesz do tego związku, czego potrzebujesz, to ** miejsce docelowe ** nowy operator, który jest tylko użyte do budowy i jawnie wywołujące destruktor we właściwym czasie. Jeśli zarządzasz niezainicjalizowaną pamięcią, musisz zachować ostrożność przy problemach z wyrównaniem i dlatego możesz używać cech typu, funkcja boost zapewnia cechy typu do określania wyrównania i generowania wyrównanych typów pamięci podczas kompilacji, ponieważ jest to platforma wieloplatformowa. tak działa podbicie :: wariant. –

3

GCC teraz wymienia je jako obsługiwane w version 4.6. Wygląda na to, że został wprowadzony 14 lipca z this patch. Przyszłość jest teraz.

+0

jak, woah ... koleś. –

Powiązane problemy