https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80328
Bug ID: 80328 Summary: With -ffloat-store std::array operator[] no longer cost-free Product: gcc Version: 6.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: pavel.celba at ricardo dot com Target Milestone: --- Following code: #include <array> #include <cstdlib> #include <ctime> #include <iostream> int main() { static const size_t numIters = 100000000u; srand(static_cast<unsigned int>(time(nullptr))); // Simple type timing float vec[3]; for (int i = 0; i < 3; ++i) vec[i] = static_cast<float>(rand()); clock_t simpleBegin = clock(); for (size_t iter = 0u; iter < numIters; ++iter) for (int i = 0; i < 3; ++i) vec[i] += vec[i]; clock_t simpleEnd = clock(); // Simple type timing std::array<float, 3> vec2; for (int i = 0; i < 3; ++i) vec2[i] = static_cast<float>(rand()); clock_t arrayBegin = clock(); for (size_t iter = 0u; iter < numIters; ++iter) for (int i = 0; i < 3; ++i) vec2[i] += vec2[i]; clock_t arrayEnd = clock(); // Suppress optimizing out whole computation volatile float suppressOptimizingOut[3]; for (int i = 0; i < 3; ++i) { suppressOptimizingOut[i] = vec[i]; suppressOptimizingOut[i] = vec2[i]; } (void)suppressOptimizingOut; // Must use the value to suppress unused warning std::cout << "Simple case time: " << double(simpleEnd - simpleBegin) / CLOCKS_PER_SEC << std::endl; std::cout << "Array case time: " << double(arrayEnd - arrayBegin) / CLOCKS_PER_SEC << std::endl; } Compile options: -Wall -std=c++11 -ffloat-store -O2 -o a.out source_file.cpp There is really no reason too - shouldn't do any additional operations compared to simple case after all optimizations.