यह एक सरल C++ कार्यक्रम है का उपयोग कर valarrays:जीसीसी अनुकूलन वैलेरिएज़ के साथ क्यों काम नहीं करता है?
#include <iostream>
#include <valarray>
int main() {
using ratios_t = std::valarray<float>;
ratios_t a{0.5, 1, 2};
const auto& res (ratios_t::value_type(256)/a);
for(const auto& r : ratios_t{res})
std::cout << r << " " << std::endl;
return 0;
}
अगर मैं संकलन और इस तरह इसे चलाने:
g++ -O0 main.cpp && ./a.out
आउटपुट के रूप में की उम्मीद है:
512 256 128
हालांकि, अगर मैं इसे संकलित करता हूं और इसे चलाता हूं:
g++ -O3 main.cpp && ./a.out
उत्पादन होता है: अगर मैं -O1
अनुकूलन पैरामीटर का उपयोग
0 0 0
एक ही होता है।
जीसीसी संस्करण (Archlinux में नवीनतम) है:
$ g++ --version
g++ (GCC) 6.1.1 20160707
हालांकि, अगर मैं बजना के साथ प्रयास करें, दोनों
clang++ -std=gnu++14 -O0 main.cpp && ./a.out
और
clang++ -std=gnu++14 -O3 main.cpp && ./a.out
ही सही परिणाम का उत्पादन:
512 256 128
बजना संस्करण है:
$ clang++ --version
clang version 3.8.0 (tags/RELEASE_380/final)
मैं भी डेबियन, जहां निष्पादन सही परिणाम का उत्पादन पर जीसीसी 4.9.2 के साथ की कोशिश की है।
क्या यह जीसीसी में एक संभावित बग है या क्या मैं कुछ गलत कर रहा हूं? क्या कोई इसे पुन: उत्पन्न कर सकता है?
संपादित करें: मैक ओएस पर जीसीसी 6 के होमब्रू संस्करण पर भी इस मुद्दे को पुन: उत्पन्न करने में कामयाब रहा।
http://melpon.org/wandbox यह 4.9.3 से 5.1 करने के लिए व्यवहार में परिवर्तन दिखाई देता है का उपयोग करना। – NathanOliver
दुर्भाग्यवश, मेरे कोडबेस में मैंने जीसीसी 4.9.3 पर भी इसी तरह की समस्या (लेकिन uint32_t के साथ) को पुन: पेश करने में कामयाब रहा है, हालांकि यह न्यूनतम उदाहरण में डालने पर काम करता है। मैं जांच कर रहा हूं ... – DoDo