Почему простой цикл константного массива C++ нарушает вывод сборки GCC 11.2 на Godbolt, но не GCC 15 или MSVC/ICX?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему простой цикл константного массива C++ нарушает вывод сборки GCC 11.2 на Godbolt, но не GCC 15 или MSVC/ICX?

Сообщение Anonymous »

Я исследовал выходные данные сборки для простого цикла C++, включающего константный массив и размер const, и столкнулся с необычным поведением GCC в Compiler Explorer (Godbolt), зависящим от версии.
Мой первоначальный вопрос был сосредоточен на, казалось бы, избыточной инструкции 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»