Ich versuche zu verstehen, wenn Compiler Array initialisieren sollten und wann sie es initialisieren sollten. Ich versuche, zwei Möglichkeiten: eine rohe Array, ein weiteres Array in einer Struktur zusammengefasst:Warum Compiler Nullen in Arrays setzen, während sie nicht müssen?
const int N = 1000;
struct A
{
uint32_t arr[N];
A() = default;
};
void print(uint32_t* arr, const std::string& message)
{
std::cout << message << ": " <<
(std::count(arr, arr + N, 0) == N ? "all zeros" : "garbage") << std::endl;
}
int main()
{
uint32_t arrDefault[N];
print(arrDefault, "Automatic array, default initialization");
uint32_t arrValue[N] = {};
print(arrValue, "Automatic array, value initialization");
uint32_t* parrDefault = new uint32_t[N];
print(parrDefault, " Dynamic array, default initialization");
uint32_t* parrValue = new uint32_t[N]();
print(parrValue, " Dynamic array, value initialization");
A structDefault;
print(structDefault.arr, "Automatic struct, default initialization");
A structValue{};
print(structValue.arr, "Automatic struct, value initialization");
A* pstructDefault = new A;
print(pstructDefault->arr, " Dynamic struct, default initialization");
A* psstructValue = new A();
print(psstructValue->arr, " Dynamic struct, value initialization");
}
Hier ist, was ich sehe für clang und VC++:
Automatic array, default initialization: garbage
Automatic array, value initialization: all zeros
Dynamic array, default initialization: garbage
Dynamic array, value initialization: all zeros
Automatic struct, default initialization: all zeros
Automatic struct, value initialization: all zeros
Dynamic struct, default initialization: garbage
Dynamic struct, value initialization: all zeros
Ausgang für gcc unterschiedlich ist nur in der erste Zeile, wo es auch "alle Nullen" setzt.
Aus meiner Sicht sind sie alle falsch, und was ich erwarten ist:
Automatic array, default initialization: garbage
Automatic array, value initialization: all zeros
Dynamic array, default initialization: garbage
Dynamic array, value initialization: all zeros
Automatic struct, default initialization: garbage
Automatic struct, value initialization: garbage
Dynamic struct, default initialization: garbage
Dynamic struct, value initialization: garbage
D.h. Ausgabe ist ok für rohe Arrays (außer gcc): wir haben Müll für Standard und Nullen für Wert. Groß. Aber für eine Struktur würde ich erwarten, ständig Müll zu haben. Von default initialization:
Standard Initialisierung wird in drei Situationen durchgeführt:
- ...
- ...
- wenn eine Basisklasse oder ein nicht-statisches Datenelement wird nicht erwähnt in eine Konstruktorinitialisierungsliste und dieser Konstruktor wird aufgerufen.
Die Wirkungen von Standardinitialisierung sind:
- wenn T ein nicht-POD (bis C++ 11) Klasse-Typ, ...
- wenn T ein Array-Typ ist, jedes Element des Arrays ist default-initialisiert;
- Andernfalls wird nichts unternommen: Die Objekte mit automatischer Speicherdauer (und deren Unterobjekte) werden initialisiert, um die Werte zu bestimmen.
In meinem Beispiel I nicht-statisches Datenelement, das nicht in einem Konstruktor Initialisiererliste erwähnt wird, die ein Array von POD-Typ ist. Ich erwarte, dass es mit unbestimmten Werten belassen wird, egal wie meine Struktur aufgebaut ist.
Meine Fragen sind:
- Warum Compiler, dass verletzen? Ich meine, warum setzen sie Nullen, wenn sie nicht müssen, verschwenden meine Laufzeit? Liege ich falsch in meinen Lesungen?
- Wie kann ich ein solches Verhalten erzwingen, um sicherzustellen, dass ich meine Runtime-Popup-Arrays nicht mit Nullen verschwenden?
- Warum Gcc Wert Initialisierung für ein automatisches Array führt?
Warum Compiler * was * verletzen? Ich sehe keine Verstöße gegen den Standard in Ihrem Code. Auf der anderen Seite gibt es so viel davon, dass ich etwas übersehen habe. – juanchopanza
Wenn der Wert unbestimmt ist, darf der Compiler * * keine Nullen schreiben? –
@TheodorosChatzigiannakis Es ist erlaubt, aber Compiler versuchen, sehr optimierten Code zu produzieren. Warum sollten sie Nullen setzen, während sie das nicht dürfen? Der einzige mögliche Grund, wenn sie _have_ haben. – Mikhail