Czy istnieje lepszy sposób kopiowania zawartości std::deque
do tablicy bajtów? Wygląda na to, że w STL powinno być coś takiego.Najbardziej wydajna metoda kopiowania treści std :: deque do tablicy bajtowej
// Generate byte-array to transmit
uint8_t * i2c_message = new uint8_t[_tx.size()];
if (!i2c_message) {
errno = ENOMEM;
::perror("ERROR: FirmataI2c::endTransmission - Failed to allocate memory!");
} else {
size_t i = 0;
// Load byte-array
for (const auto & data_byte : _tx) {
i2c_message[i++] = data_byte;
}
// Transmit data
_marshaller.sendSysex(firmata::I2C_REQUEST, _tx.size(), i2c_message);
_stream.flush();
delete[] i2c_message;
}
szukam sugestii dotyczących zarówno przestrzeni lub prędkości lub obu ...
EDIT: Należy zauważyć, że nie można rzucać
_marshaller.sendSysex()
.
FOLLOW UP:
Pomyślałem, że warto byłoby bieżnikowania wszystko, ponieważ komentarze są bardzo pouczające (z wyjątkiem wojny płomienia). :-P
Odpowiedź na pytanie, zadane ...
Zastosowanie std::copy
Im większy obraz:
Zamiast po prostu zwiększenie surowe wykonanie kodu, warto było rozważyć dodanie solidności i długowieczności do bazy kodu.
Przeoczyłem RAII - Akwizycja zasobów jest inicjowana. Kierując się w przeciwnym kierunku i biorąc niewielki wpływ na osiągi, mogłem uzyskać duże zyski w zakresie odporności (jak zauważyli @PaulMcKenzie i @WhozCraig). W rzeczywistości mogę nawet izolować mój kod od zmian w zależności!
Ostateczne Rozwiązanie:
W tym przypadku, tak naprawdę mają dostęp do (i zdolność do zmiany) większą bazę Code - często nie przypadek. Ponownie oceniam * korzyść, którą zyskałem dzięki użyciu std::deque
i zamieniłem cały podstawowy kontener na std::vector
. W ten sposób można zaoszczędzić na wydajności związanej z zamianą kontenerów i uzyskać korzyści z sąsiadujących danych i RAII.
* Wybrałem std::deque
, ponieważ zawsze mam do push_front
dwa bajty, aby sfinalizować moją tablicę bajtów przed wysłaniem. Ponieważ jednak jest to zawsze dwa bajty, udało mi się umieścić wektor z dwoma bajtami i zastąpić je losowym dostępem - O (n).
'std :: copy()' może? – user0042
Widziałem tylko 'std :: copy' używane do kopiowania z tablicy do kontenera, a nie odwrotnie. – Zak
Po pierwsze, użyłbym 'std :: vector'. po drugie, użyłbym konstruktora iteratora do zbudowania tego samego. To eliminuje większość tego kodu, w tym daje [wiarygodne RAII] (http://en.cppreference.com/w/cpp/language/raii). element 'data()' wektora lub adres-pierwszego-elementu dałby ci wskaźnik do sąsiednich danych, które wydajesz się szukać. –
WhozCraig