RPH - blog

Blog programisty

Niezwykły operator ternarny ?: w C++

Opublikowany: Czwartek 19.01.2017
0

Każdy zna ten trójargumentowy operator, który istnieje już w języku C. Operator ?: przyjmuje trzy argumenty, pierwszy z nich to wyrażenie, które ma zwracać wartość logiczną, na podstawie której wybierana jest jedna z dwóch pozostałych argumentów. Jeżeli wartość pierwszego wyrażenia będzie oznaczała true, wtedy zostanie zwrócony pierwszy argument, w przeciwnym przypadku drugi....

Czytaj dalej...

Błędy w implementacjach C++

Opublikowany: Niedziela 20.03.2016
1

W ostatnim tygodniu znalazłem dwa błędy w implementacjach C++. Mówiąc implementacja C++ mam na myśli i kompilator i bibliotekę standardową.

Znalezienie pierwszego z nich jest następstwem mojego błędu. Klasa umożliwiała dostęp do jednego ze swojch pól - sety przez dostęp do iteratorów. Kod był podobny do poniższego:

Czytaj dalej...

Generyczny wzorzez dekoratora i debugowanie OpenGL

Opublikowany: Czwartek 14.01.2016
0

Pomysł wpadł mi do głowy o godzinie 2 nad ranem. Pomimo tego że o 6:30 miał zadzwonić budzik, aby obudzić mnie do pracy, poświęciłem godzinę aby zamienić koncepcję w kawałek kodu. Ale może od początku, zacząłem się uczyć OpenGL. Niestety w moim programie cały czas występował błąd OpenGL: invalid enum. I nie mogłem go znaleźć.

Zastosowałem więc wzorzec dekoratora, aby po każdym wywołaniu funkcji OpenGL występowało sprawdzenie czy wystąpił błąd. Opracowane przeze mnie rozwiązanie jest na tyle ogólne, że bez problemu może zostać zastosowane do rozwiązania innych problemów.

Czytaj dalej...

C++, operatory pre i post inkrementacji w nowoczesnych kompilatorach

Opublikowany: Czwartek 07.01.2016
0

Bardzo popularnym zaleceniem dla programistów C++, jest rada, aby tam gdzie jest tylko możliwe używać operatora pre inkrementacji, zamiast post inkrementacji, szczególnie w pętlach.

Zalecenie to znajduje się w dokumencie Collaborative Collection of C++ Best Practices, w rozdziale przeznaczonym wydajności: https://github.com/lefticus/cppbestpractices/blob/master/08-Considering_Performance.md#prefer-i-to-i

Dobre wyjaśnienie dlaczego należy tak postępować znajduje się na blogu Gynvael Coldwind: C/C++ szybkość i++ oraz ++i once more, reply (niestety link do kodzimy.net, który jest tam umieszczony nie działa).

Zatem, operator pre inkrementacji, w przeciwieństwie do operatora post inkrementacji, nie tworzy tymczasowej kopii obiektu. Jest tak dla typów, które nie są typami podstawowymi, ale np. iteratorami.

Ponieważ nowoczesne kompilatory potrafią bardzo agresywnie optymalizować kod wynikowy, tak, że wygenerowanego kodu asemblerowego jest mniej niż kodu C++ z którego powstał (jaskrawy przykład tu: A flexible lexicographical comparator for C++ structs ), postanowiłem sprawdzić jak to dziś wygląda w praktyce.

Czytaj dalej...
  • 1