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;
...