2011-10-28 10 views
5

boost::array (lub wersja tr1 lub std) oferują kilka ciekawych funkcji dodatkowych w obrębie wbudowanej tablicy.Czy zawsze bezpiecznie można zastąpić wbudowaną macierz std/tr1/boost :: array?

Do tej pory nasze codebase zawiera tylko wbudowane w macierze, np (wykonane, ale styl pasuje):

WORD m_lastReadFlags[FLAGS_MAX]; 
... 
WORD flagBuffer[FLAGS_MAX]; 
if (getFlags(flagBuffer)) { 
    memcpy(m_lastReadFlags, flagBuffer, sizeof(m_lastReadFlags)); 
    ... 

myślę one'll pomysł.

Teraz moje pytanie brzmi, dla tych miejsc w kodzie, gdzie spadek w boost::array miałby sens (z powodu innych dokonanych zmian), czy array jest 100% semantyką zachowując drop-in dla wbudowanej tablicy? (Możliwe błędy kompilatora są OK - tylko ciche zmiany behawioralne są co mi przeszkadza.)

Oznacza to, mógłby powyższy kod ponownie napisane (na przykład) do użycia:

boost::array<WORD, FLAGS_MAX> m_lastReadFlags; 

i memcpy (ewentualnie przystosowany do użycia c_array() lub data()) i inny dostęp podobny do tablicy pozostanie taki sam? Tak, oczywiście mógłbym również zastąpić bufor lokalny tablicą i usunąć memcpy lub użyć std::copy lub coś podobnego, ale punktem tego pytania jest kompatybilność wbudowanych tablic i klasy tablicowej.


Aktualizacja: Jedna rzecz, która mnie niepokoi jest specjalnie miejsca (jak w przypadku memcpy) gdzie wbudowanej tablice są wykorzystywane jako wskaźniki. Czy wszystkie wystąpienia zostaną przechwycone przez kompilator /obsługiwane poprawnie?

Co z przydziałem?

T arr1[N]; // or array<T, N> 
T arr2[N]; // or array<T, N> 
T* p1; 
... 
// Note, not all combinations will compile: 
arr1 = arr2; 
p1 = arr1; 
arr2 = p1; 
... 

Odpowiedz

5

Tak, to powinno być w porządku, ponieważ klasa array właśnie wrapper dla automatycznej tablicy. Ma tę samą składnię dostępu w nawiasach kwadratowych, a jeśli chcesz dostać się do wskaźnika, wiesz jak to zrobić. Możesz nawet używać wszędzie: std::copy i używać iteratorów; są szanse, że i tak będzie to realizowane przez memcpy.

Klasa array jest łącznej typu (bez nietrywialne konstruktorzy/destruktor/przelew), dzięki czemu można go zainicjować z tradycyjnych agregat (klamra) inicjatora, podobnie jak zwykły tablicy.

Powiązane problemy