Jeśli jesteś programistą C++ i nie znasz specyfikatora ‘register’ to myślę, że warto go poznać.
Dodany do definicji obiektu ( int ) prosi kompilator o to aby umieścił dany obiekt w rejestrze procesora a nie tak jak to się dzieje zwykle do komórki pamięci.
Co to nam daje?
Dostęp do danych zawartych w rejestrach jest prawie natychmiastowy, podczas gdy dostęp do komórek w pamięci RAM trwa stosunkowo długo.
Dlaczego napisałem, że dodając specyfikator register jedynie prosimy o to aby kompilator umieścił dany obiekt w rejestrze?
Ponieważ nie ma gwarancji, że kompilator umieści tam nasz obiekt lecz tylko spore prawdopodobieństwo.
Kiedy stosować?
Wtedy kiedy wiemy, że będziemy korzystać z danego obiektu bardzo wiele razy. Dzięki temu nasz program będzie się wykonywać trochę, a czasami dużo szybciej.
Kiedy nie stosować?
Gdy będziemy chcieli znać adres danego obiektu. Rejestr adresuje się inaczej niż komórki pamięci RAM. Gdy o tym zapomnimy kompilator zignoruje naszą prośbę o umieszczenie obiektu w rejestrze.
Pamiętaj także, żeby używać tego specyfikatora dosyć rozważnie. Pamięć procesora nie jest duża więc nie przesadzaj z umieszczaniem tam wszystkich obiektów.
Na zachętę zrobiłem mały test aby pokazać Wam, że czasami bardzo opłaca się pamiętać o rejestrze.
Program standardowy.
#include <iostream>
using namespace std; int main() {int a = 1; unsigned int b = 4294967295;while (b)
{
a = 100 * a * a * b * b / b / a * 2 - 20 + b * b * a;--b; }return 0; }Ten sam program ale wykorzystujący rejestr to przechowywania 2 obiektów.
#include <iostream>
using namespace std;int main() { register int a = 1; register unsigned int b = 4294967295;while (b) { a = 100 * a * a * b * b / b / a * 2 - 20 + b * b * a;-–b; } return 0;}W tym przypadku wzrost wydajności jest bardzo duży. Program pierwszy wykonuje się u mnie przez 229 sekund podczas gdy drugi program wykonuje się zaledwie 13 sekund!
Screen:
Zobacz także: http://pl.wikipedia.org/wiki/Rejestr_procesora
Mała uwaga co do „unsigned int b = 4294967295;” . Rozumiem, że liczba ta to zasięg unsigned int.
Zależy on jednak od procesora na którym kompiluje się program. W większości wypadków będzie to właśnie taka liczba, ale nie zawsze. W C (w C++ pewnie jakoś podobnie) dołącza się a liczbę zastępuje się makrem ULONG_MAX . Warto o tym pamiętać 🙂
By: Jacek Bajor on 22 marca, 2007
at 6:50 pm
WordPress wywali część mojego komentarza (wziął go za taga html). Powinno być: […] jakoś podobnie) dołącza się < limits.h >
By: Jacek Bajor on 22 marca, 2007
at 6:54 pm
Tak, ale w tym przypadku to nie jest ważne. To tylko liczba powtórzeń pętli, którą lepiej mieć zawsze taką samą a nie domyślać się ile razy wykonała się pętla na podstawie procesora 🙂
By: changs on 23 marca, 2007
at 1:48 pm
MAAF NUMPANG IKLANnTERIMA PANGGILANnLES PRIVATE KOMPUTER dan SERVICE KOMPUTERnANTON DI 08159938717 / 02193717042n( TIDAK SMS ! Click https://twitter.com/moooker1
By: hollybradford45515 on 8 kwietnia, 2016
at 2:05 pm