2016-05-07 3 views
1

Ich arbeite mit einer Funktion auf dem kritischen Pfad. Der Code sieht so aus:Erstes Element im POD-Array initialisieren, verbleibende Elemente nicht initialisiert lassen

void ProcessData(const byte* input, size_t size) 
{ 
    ALIGN_ARRAY(16) int32_t m0[2] = { ((const int32_t*)input)[0] }; 
    ALIGN_ARRAY(16) int32_t m1[2] = { ((const int32_t*)input)[1] }; 
    ... 
} 

Das erste Element, m0[0] ist diejenige, die ich zu kümmern. Das zweite Element, m0[1], ist Speicherplatz und hält die Dinge in Ordnung, bevor m an die SIMD-Engine ausgeliefert wird. m0[1] wird mit einem Wert gefüllt, aber ich brauche es nicht initialisiert.

Dieser Code wird wiederholt und sehr einflussreich auf Benchmarking-Ergebnisse, so ist es wichtig, alles zu minimieren. Ich möchte, dass der Compiler weiß, dass er das erste Element initialisieren kann, weil der Code besser optimiert werden kann.

Wie stelle ich sicher, dass nur das erste Element initialisiert wird und die restlichen Elemente im Array nicht initialisiert sind? Ist es überhaupt möglich?


Diese Frage ist Gegenteil von Fragen wie Initialization of a normal array with one default value, Static array initialization of individual elements in C++ und Array initialization with {0}, {0,}?

ich auch bewusst bin, dass die Initialisierung als Zuordnung unterscheidet; und einige der Details von zero-, default- and value-initialization und wie PODs es beeinflussen.

+2

Entweder initialisieren Sie nichts oder alles. Lassen Sie das Array in Ihrem Fall nicht initialisiert und weisen Sie es dann seinem ersten Element zu. –

+0

Danke @KerrekSB. Ich hatte davor etwas Angst. Wenn das der Fall ist, dann können Sie auch für das Protokoll antworten. – jww

Antwort

1

Nicht sicher, was ist Eingabe, vor allem, da es Typ von Byte hat und Sie in Int32 Casting sind. Wenn Sie auf der x86-Plattform sind, achten Sie auf Backwords (Endianness-Probleme).

Versuchen Sie etwas wie das, aber mit der passenden Besetzung.

void ProcessData(const byte* input, size_t size) 
{ 
    ALIGN_ARRAY(16) int32_t m0[2]; 
    m0[0]= = (const int32_t*)input)[0]; 
    ALIGN_ARRAY(16) int32_t m1[2]; 
    m1[0] = (const int32_t*)input)[1]; 
    ... 
} 
1

Mit einem Stack zugewiesenen Array ist es unmöglich. Sogar in C++ 03 sind alle ausgelassenen Elemente aus der Initialisierungsliste standardmäßig initialisiert (wenn Klassentyp) oder wertinitialisiert (falls nicht). Sie haben ein paar Optionen:

  1. Lassen Sie Array nicht initialisiert, initialisieren Sie ein Element.
  2. Verwenden Sie einen Klassenwrapper.
  3. Overengineer das Szenario.

Hier ist, wie Sie das tun könnten.

const uint8_t input[...]; 

std::pair< int32_t*, std::ptrdiff_t > ms[...]; 

for (int i = 0; i < ...; ++i) 
{ 
    ms[i] = std::get_temporary_buffer<int32_t>(2); 
    std::copy((const int32_t*)input + i, (const int32_t*)input + i + 1, 
       std::raw_storage_iterator<int32_t*, int32_t>(ms[i].first)); 
} 
// later loop std::return_temporary_buffer(ms[...].first); at end of function 
Verwandte Themen