"as-if rule" daje kompilatorowi prawo do optymalizacji lub zmiany kolejności wyrażeń, które nie wpłyną na wydajność i poprawność programu zgodnie z określonymi regułami, takimi jak;Reguła as-if i usunięcie przydziału
§1.9.5
Wykonanie zgodne wykonywanie również uformowaną programu są produkować ten sam problem zauważalnego jako jeden z możliwych wykonaniach z odpowiednim przykład abstrakcyjnej maszyny za pomocą samego programu i to samo wejście.
cppreference url I połączone powyżej wyraźnie wymienia szczególne zasady dotyczące wartości lotnych obiektów, a także dla „nowych wyrażeń”, pod C++ 14:
Nowa ekspresja ma inny wyjątek z reguły "jak gdyby": kompilator może usuwać wywołania do wymiennych funkcji przydziału, nawet jeśli dostarczono zdefiniowaną przez użytkownika wymianę i ma zauważalne skutki uboczne.
zakładam „wymienny” tutaj jest to, co mówi się na przykład w
§18.6.1.1.2
wymienianej: programu C++ mogą zdefiniować funkcję z tej funkcji podpisu który zastępuje domyślną wersję zdefiniowaną przez standardową bibliotekę C++ .
Czy to poprawne, że poniższe mem
może zostać usunięte lub zmienione zgodnie z zasadą "jak to"?
{
... some conformant code // upper block of code
auto mem = std::make_unique<std::array<double, 5000000>>();
... more conformant code, not using mem // lower block of code
}
Czy istnieje sposób, aby upewnić się, że nie został usunięty i pozostaje między górnym i dolnym blokiem kodu? Pojawia się dobrze ulotny (albo niestabilny std :: array albo left of auto), ale ponieważ nie ma odczytu z mem
, myślę, że nawet to nie pomogłoby zgodnie z zasadą jak-if.
Nota boczna; Nie udało mi się zdobyć pracowni wizualnej 2015, by zoptymalizować mem
i alokować w ogóle.
Wyjaśnienie: Droga do obserwować byłoby to, że wywołanie przypisania do systemu operacyjnego znajduje się między każdym wejściu/wyjściu z dwóch bloków. Chodzi o przypadki testowe i/lub próby przydzielenia obiektów w nowych lokalizacjach.
Wierzę, że lotny by tam pomógł, ale jest inny problem: nic nie zależy od wartości mem, więc kompilator może przenosić alokację gdziekolwiek w tym bloku kodu. Może przydzielić na samym początku, na końcu i w każdym innym miejscu. –
@Revolver_Ocelot Nie sądzę, że lotny może nawet coś zmienić. 'make_unique' tworzy nowy obiekt i, o ile wiem, kompilatory C++ _nie_ optymalizują tworzenie obiektów ze względu na potencjalne efekty uboczne. Mogą one powodować niepotrzebne wywołania konstruktorów, ale zawsze zapewniają, że przynajmniej jeden z nich jest wywoływany. W przeciwnym razie kod wykorzystujący obiekty dla RAII posiadającego konstruktory z efektami ubocznymi nie mógł bezpiecznie polegać na tym wzorze bez uwzględnienia barier pamięci. – JAB
** [intro.execution]/8 ** mówi: "Dostęp do obiektów lotnych jest oceniany ściśle według reguł maszyny abstrakcyjnej_". Przeczytałem to jako "jak-jeśli reguła nie może być zastosowana do lotnych obiektów", więc powinna pomóc. –