Мой первоначальный вопрос был сосредоточен на, казалось бы, избыточной инструкции add eax, ecx в оптимизированной сборке GCC. При попытке воспроизвести это в Godbolt с GCC 11.2 я столкнулся с ошибкой компоновщика (даже с небольшим массивом из 8 чисел), которой не было в GCC 15, MSVC или ICX. Когда я позже повторно протестировал GCC 11.2 (и даже компиляторы MSVC и ICX), ошибка компоновщика исчезла, а вывод сборки также изменился и стал более оптимизированным (аналогично тому, что выдает GCC 15 или MSVC/ICX).
Мой код C++:
Код: Выделить всё
#include
#include // Changed to vector as per original question's context, though assembly difference is seen with array too
#include
int main() {
const int data_size = 8; // Small size for quick testing
// Using std::vector as in the original question, but the issue was seen with arrays too.
const std::vector data = {0, 1, 2, 3, 4, 5, 6, 7};
int sum = 0;
for (int i = 0; i < data_size; ++i) {
sum += data[i];
}
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79799032/why-does-a-simple-c-const-array-loop-break-gcc-11-2-assembly-output-on-godbolt[/url]
Мобильная версия