Ho cercato di utilizzare le nuove funzionalità del linguaggio C++ come gli iteratori su sistemi embedded (16 KB di SRAM e 64 KB di flash, Cortex M4) e ho raggiunto un sorprendente roadblock. Perché sulla terra esistono iteratori così mostruosamente grandi? Avevo l'impressione che fossero fondamentalmente dei puntatori aritmetici o indicizzati. STL sta inserendo un codice inaspettato?Perché l'utilizzo di iteratori C++ aumenta drasticamente le dimensioni del codice rispetto a at() o all'indicizzazione?
Questi stanno utilizzando Kinetis Design Studio su Windows con la toolchain gcc-arm-none-eabi-4_9 da here utilizzando i seguenti flag.
arm-none-eabi-g++ -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fsingle-precision-constant -flto -g3 -I"../Sources" -I"../Includes" -std=gnu++11 -fabi-version=0 -std=c++11 -MMD -MP -MF"Sources/System.d" -MT"Sources/System.o" -c -o "Sources/System.o" "../Sources/System.cpp"
ITM_SendChar prende solo un singolo carattere e lo inserisce in un registro.
std::string input = "Oh hai there! :D\n";
#ifdef char_array
// .text 7352
// .data 376
// .bss 236
for(int i = 0; i < input.size(); i++)
ITM_SendChar(input[i]);
#endif
#ifdef char_at
// .text 7392
// .data 376
// .bss 236
for(int i = 0; i < input.size(); i++)
ITM_SendChar(input.at(i));
#endif
#ifdef char_itterator
// .text 39744
// .data 384
// .bss 252
for(char some_char : input)
ITM_SendChar(some_char);
#endif
#ifdef char_itterator_auto
// .text 39744
// .data 384
// .bss 252
for(auto some_char : input)
ITM_SendChar(some_char);
#endif
#ifdef char_itterator_auto_no_copy
// .text 39744
// .data 384
// .bss 252
for(auto& some_char : input)
ITM_SendChar(some_char);
#endif
Si sta compilando in alcune configurazioni di debug? Non conosco il tuo ambiente di compilazione, ma, ad esempio, nella configurazione di debug di Visual C++ vengono eseguiti tutti i tipi di controllo. – JohnB
Per prima cosa dovresti confrontare le mele con le mele e non fare copie nel ciclo basato su intervalli. Cosa succede se usi 'auto & some_char: input'? – NathanOliver
Grazie a @NathanOliver per il suggerimento, ma nessun cambiamento. Ho aggiunto i risultati alla mia domanda. E JohnB c'è il flag -g3 per il debug ma rimuoverlo non fa alcuna differenza. Il KDS, per quanto ne so, non include nulla in più durante il debug. – hak8or