Jaka jest zasada „ jak gdyby ”?
Reguła „ as-if ” zasadniczo definiuje, jakie transformacje implementacja może wykonać na legalnym programie w C ++. Krótko mówiąc, wszystkie przekształcenia, które nie wpływają na „ obserwowalne zachowanie ” programu (dokładna definicja znajduje się poniżej).
Celem jest zapewnienie implementacjom swobody wykonywania optymalizacji, o ile zachowanie programu pozostaje zgodne z semantyką określoną w standardzie C ++ w odniesieniu do maszyny abstrakcyjnej.
Gdzie norma wprowadza tę zasadę?
Standard C ++ 11 wprowadza zasadę „ as-if ” w paragrafie 1.9 / 1:
Opisy semantyczne w niniejszej Normie Międzynarodowej definiują sparametryzowaną niedeterministyczną maszynę abstrakcyjną. Niniejsza Norma Międzynarodowa nie nakłada żadnych wymagań dotyczących struktury wdrożeń zgodnych. W szczególności nie muszą kopiować ani naśladować struktury abstrakcyjnej maszyny. Raczej zgodne implementacje są wymagane do emulacji (tylko) obserwowalnego zachowania abstrakcyjnej maszyny, jak wyjaśniono poniżej.
Ponadto przypis wyjaśniający dodaje:
To postanowienie jest czasami nazywane zasadą „jak gdyby” , ponieważ implementacja może zignorować jakiekolwiek wymagania niniejszej Normy Międzynarodowej, o ile wynik jest taki, jakby wymaganie było przestrzegane, o ile można to ustalić na podstawie obserwowalnego zachowania programu. Na przykład rzeczywista implementacja nie musi oceniać części wyrażenia, jeśli może wywnioskować, że jego wartość nie jest używana i że nie powstają żadne skutki uboczne wpływające na obserwowalne zachowanie programu.
Co dokładnie nakazuje reguła?
Pkt 1.9 / 5 dalej określa:
Zgodna implementacja wykonująca dobrze uformowany program będzie dawać takie samo obserwowalne zachowanie, jak jedno z możliwych wykonań odpowiedniej instancji maszyny abstrakcyjnej z tym samym programem i tymi samymi danymi wejściowymi . Jednakże, jeśli jakiekolwiek takie wykonanie zawiera niezdefiniowaną operację, niniejsza Norma Międzynarodowa nie nakłada żadnych wymagań na implementację wykonującą ten program z tym wejściem (nawet w odniesieniu do operacji poprzedzających pierwszą niezdefiniowaną operację).
Warto podkreślić, że ograniczenie to ma zastosowanie tylko przy „wykonywaniu dobrze sformułowanego programu” , a możliwe wyniki wykonania programu, który zawiera niezdefiniowane zachowanie, są nieograniczone. Jest to również wyraźnie określone w paragrafie 1.9 / 4:
Niektóre inne operacje są opisane w niniejszej Normie Międzynarodowej jako niezdefiniowane (na przykład skutek próby zmodyfikowania obiektu const). [Uwaga: Niniejsza Norma Międzynarodowa nie nakłada żadnych wymagań dotyczących zachowania programów, które zawierają nieokreślone zachowanie . —End note]
Wreszcie, jeśli chodzi o definicję „ obserwowalnego zachowania ”, ust. 1.9 / 8 brzmi następująco:
Najmniejsze wymagania dotyczące zgodnej implementacji to:
- Dostęp do obiektów ulotnych jest oceniany ściśle według reguł abstrakcyjnej maszyny.
- W momencie zakończenia programu wszystkie dane zapisane w plikach będą identyczne z jednym z możliwych wyników, które dałoby wykonanie programu zgodnie z abstrakcyjną semantyką.
- Dynamika wejścia i wyjścia urządzeń interaktywnych powinna odbywać się w taki sposób, aby dane wyjściowe zachęty były faktycznie dostarczane, zanim program będzie oczekiwał na wejście. To, co stanowi urządzenie interaktywne, jest zdefiniowane w implementacji.
Są one łącznie określane jako obserwowalne zachowanie programu . [ Uwaga : Bardziej rygorystyczne powiązania między abstrakcyjną a rzeczywistą semantyką mogą być zdefiniowane przez każdą implementację. - notatka końcowa ]
Czy są sytuacje, w których ta zasada nie ma zastosowania?
O ile mi wiadomo, jedynym wyjątkiem od reguły „ jak gdyby ” jest opcja kopiowania / przenoszenia, która jest dozwolona, nawet jeśli konstruktor kopiujący, konstruktor przenoszenia lub destruktor klasy mają efekty uboczne. Dokładne warunki tego są określone w paragrafie 12.8 / 31:
Gdy spełnione są określone kryteria, implementacja może pominąć konstrukcję kopiowania / przenoszenia obiektu klasy, nawet jeśli konstruktor wybrany do operacji kopiowania / przenoszenia i / lub destruktor obiektu mają efekty uboczne . […]