Namensräume
Varianten
Aktionen

std::uninitialized_fill

Von cppreference.com
< cpp‎ | memory
 
 
Speicherverwaltungsbibliothek
(nur Exposition*)
Algorithmen für uninitialisierten Speicher
uninitialized_fill
(C++17)
(C++17)
(C++17)
Beschränkte uninitialisierte
Speicher-Algorithmen
C-Bibliothek

Allocatoren
Speicherressourcen
Unterstützung für Garbage Collection
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
Uninitialisierter Speicher
Explizites Lebenszeitmanagement
 
Definiert in Header <memory>
template< class NoThrowForwardIt, class T >

void uninitialized_fill( NoThrowForwardIt first,

                         NoThrowForwardIt last, const T& value );
(1) (constexpr seit C++26)
template< class ExecutionPolicy, class NoThrowForwardIt, class T >

void uninitialized_fill( ExecutionPolicy&& policy,
                         NoThrowForwardIt first,

                         NoThrowForwardIt last, const T& value );
(2) (seit C++17)
1) Kopiert value in einen uninitialisierten Speicherbereich [firstlast), als ob durch

for (; first != last; ++first)
    ::new (voidify(*first))
        typename std::iterator_traits<NoThrowForwardIt>::value_type(value);

Wenn während der Initialisierung eine Ausnahme ausgelöst wird, werden die bereits konstruierten Objekte in nicht spezifizierter Reihenfolge zerstört.
2) Wie (1), wird aber gemäß policy ausgeführt.
Diese Überladung nimmt an der Überladungsauflösung teil, nur wenn alle folgenden Bedingungen erfüllt sind

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> ist true.

(bis C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> ist true.

(seit C++20)

Inhalt

[edit] Parameter

first, last - das Iterator-Paar, das den Bereich der zu initialisierenden Elemente definiert
value - Der Wert, mit dem die Elemente konstruiert werden sollen
policy - die Ausführungsrichtlinie, die verwendet werden soll
Typanforderungen
-
NoThrowForwardIt muss die Anforderungen von LegacyForwardIterator erfüllen.
-
Kein Inkrementieren, Zuweisen, Vergleichen oder Dereferenzieren von gültigen Instanzen von NoThrowForwardIt darf Ausnahmen auslösen. Das Anwenden von &* auf einen NoThrowForwardIt-Wert muss einen Zeiger auf seinen Werttyp ergeben.(bis C++11)

[edit] Komplexität

Linear zur Distanz zwischen first und last.

[edit] Ausnahmen

Die Überladung mit einem Template-Parameter namens ExecutionPolicy meldet Fehler wie folgt

  • Wenn die Ausführung einer Funktion, die als Teil des Algorithmus aufgerufen wird, eine Ausnahme auslöst und ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsabhängig.
  • Wenn dem Algorithmus der Speicher zur Neuzuweisung fehlt, wird std::bad_alloc ausgelöst.

[edit] Hinweise

Feature-Test-Makro Wert Std Feature
__cpp_lib_raw_memory_algorithms 202411L (C++26) constexpr für spezialisierte Speicher-Algorithmen, (1)

[edit] Mögliche Implementierung

template<class NoThrowForwardIt, class T>
constexpr void uninitialized_fill(NoThrowForwardIt first, NoThrowForwardIt last,
                                  const T& value)
{
    using V = typename std::iterator_traits<NoThrowForwardIt>::value_type;
    NoThrowForwardIt current = first;
    try
    {
        for (; current != last; ++current)
            ::new (static_cast<void*>(std::addressof(*current))) V(value);
    } 
    catch (...)
    {
        for (; first != current; ++first)
            first->~V();
        throw;
    }
}

[edit] Beispiel

#include <algorithm>
#include <iostream>
#include <memory>
#include <string>
 
int main()
{
    const std::size_t sz = 4;
    std::allocator<std::string> alloc;
    std::string* p = alloc.allocate(sz);
 
    std::uninitialized_fill(p, p + sz, "Example");
 
    for (std::string* i = p; i != p + sz; ++i)
    {
        std::cout << *i << '\n';
        i->~basic_string<char>();
    }
 
    alloc.deallocate(p, sz);
}

Ausgabe

Example
Example
Example
Example

[edit] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 866 C++98 wenn T der Werttyp von NoThrowForwardIt ist, und wenn
T::operator new existiert, kann das Programm ill-formed sein
verwendet stattdessen globalen Placement new
LWG 2433 C++11 dieser Algorithmus kann durch überladenes operator& gekapert werden verwendet std::addressof
LWG 3870 C++20 dieser Algorithmus kann Objekte auf einem const Speicher erstellen nicht erlaubt

[edit] Siehe auch

kopiert ein Objekt in einen uninitialisierten Speicherbereich, definiert durch einen Start und eine Anzahl
(Funktions-Template) [edit]
kopiert ein Objekt in einen uninitialisierten Speicherbereich, definiert durch einen Bereich
(Algorithmus-Funktionsobjekt)[edit]