Udostępnij za pośrednictwem


/Zc:nrvo (Kontrolka opcjonalna NRVO)

Opcja /Zc:nrvo kompilatora steruje opcjonalnym zachowaniem kopiowania lub przenoszenia elisionu w standardzie C++ w warstwie Standardowa o nazwie return value optimization (NRVO).

Składnia

/Zc:nrvo[-]

Uwagi

W programie Visual Studio 2022 w wersji 17.4 lub nowszej można jawnie włączyć opcjonalne zachowanie kopiowania lub przenoszenia elizji przy użyciu opcji kompilatora /Zc:nrvo . Ta opcja jest domyślnie wyłączona, ale jest ustawiana automatycznie podczas kompilowania przy użyciu opcji, opcji lub /std:c++20 nowszej./O2 /permissive- W obszarze /Zc:nrvoskopiuj i przenieś elision jest wykonywany wszędzie tam, gdzie jest to możliwe. Opcjonalne kopiowanie lub przenoszenie elizji można również jawnie wyłączyć przy użyciu /Zc:nrvo- opcji . Te opcje kompilatora kontrolują tylko opcjonalną kopię lub przenieś elision. Nie można wyłączyć obowiązkowej kopii lub przeniesienia elizji (określonej przez standard C++).

Obowiązkowe kopiowanie i przenoszenie elizji

Standard C++ wymaga kopiowania lub przenoszenia elizji, gdy zwracana wartość jest inicjowana w ramach instrukcji return. Na przykład jest to wymagane, gdy funkcja zwraca ExampleType zwracany przy użyciu polecenia return ExampleType();. Kompilator MSVC zawsze wykonuje operację kopiowania i przenoszenia elizji dla return instrukcji, gdy jest to wymagane, nawet w obszarze /Zc:nrvo-.

Opcjonalna kopia i przenoszenie elizji

return Gdy instrukcja zawiera wyrażenie typu innego niż pierwotny, jego wykonanie kopiuje wynik wyrażenia do miejsca zwrotnego funkcji wywołującej. Kompilator wywołuje konstruktor kopiowania lub przenoszenia zwracanego typu. Następnie, gdy funkcja zostanie zakończona, są wywoływane destruktory zmiennych lokalnych funkcji, które zawierają wszystkie zmienne o nazwie w wyrażeniu.

Standard C++ umożliwia (ale nie wymaga) kompilatorowi opcjonalne konstruowanie zwróconego obiektu bezpośrednio w miejscu zwrotnym funkcji wywołującej. Ta konstrukcja pomija (lub eliminuje) kopię lub konstruktor przenoszenia wykonany w ramach instrukcji return . W przeciwieństwie do większości innych optymalizacji ta transformacja może mieć zauważalny wpływ na dane wyjściowe programu. Mianowicie konstruktor kopiowania lub przenoszenia i skojarzonego destruktora są wywoływane po jednym czasie. Standard nadal wymaga, aby nazwana zwracana zmienna zawiera zdefiniowaną kopię lub konstruktor przenoszenia, nawet jeśli kompilator wymyka się konstruktorowi we wszystkich przypadkach.

W wersjach wcześniejszych niż Program Visual Studio 2022 w wersji 17.4, gdy optymalizacje są wyłączone (na przykład w obszarze /Od lub w funkcjach oznaczonych ) #pragma optimize("", off)kompilator wykonuje tylko obowiązkowe kopiowanie i przenoszenie elizji. W obszarze /O2starsze kompilatory wykonują opcjonalną kopię lub przenieś elision po powrocie nazwanej zmiennej w zoptymalizowanej funkcji, gdy spełnione są wszystkie te warunki: nie ma pętli ani obsługi wyjątków, nie zwraca wielu symboli z nakładającymi się okresami istnienia, konstruktor kopii lub przenoszenia typu nie ma argumentów domyślnych.

Program Visual Studio 2022 w wersji 17.4 zwiększa liczbę miejsc, w których kompilator wykonuje opcjonalne kopiowanie lub przenoszenie elizji w obszarze /Zc:nrvo, bez względu na to, czy jest włączone jawnie, czy automatycznie przy użyciu /O2opcji , /permissive-lub /std:c++20 nowszych. W systemie /Zc:nrvokompilator wykonuje opcjonalną kopię lub przenieś elision po powrocie nazwanej zmiennej dla dowolnej funkcji, gdy: nie ma pętli ani obsługi wyjątków (tak jak poprzednio); zwraca zmienną z pętli; ma obsługę wyjątków; zwracany typ kopii lub konstruktor przenoszenia ma argumenty domyślne. Opcjonalne elizji kopiowania lub przenoszenia nigdy nie są wykonywane w przypadku /Zc:nrvo- zastosowania lub gdy funkcja zwraca wiele symboli z nakładającymi się okresami istnienia lub w przypadku rzutu nazwanej zmiennej.

Aby uzyskać więcej informacji i przykłady obowiązkowej i opcjonalnej elizji kopiowania w obszarze /Zc:nrvo, zobacz Ulepszanie kopiowania i przenoszenia elizji w blogu zespołu języka C++.

Aby ustawić tę opcję kompilatora w programie Visual Studio

  1. Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać szczegółowe informacje, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilowania w programie Visual Studio).

  2. Wybierz stronę Właściwości>konfiguracji C/C++>Wiersza polecenia.

  3. W obszarze Dodatkowe opcje dodaj /Zc:nrvo lub /Zc:nrvo-. Wybierz przycisk OK lub Zastosuj , aby zapisać zmiany.

Zobacz też

/Zc (Zgodność)
/O2
/permissive-
/std (Określ wersję standardową języka)