Сбой следующего кода для меня при использовании GCC для сборки для ARM:
#include <vector>
using namespace std;
void foo(vector<bool>& bools) {
bools.push_back(true);
}
int main(int argc, char** argv) {
vector<bool> bools;
bool b = false;
bools.push_back(b);
}
Мой компилятор: arm_v5t_le-gcc (GCC) 3.4.3 (MontaVista 3.4.3-25.0.30.0501131 2005-07-23)
. Сбой не возникает при сборке для отладки, но происходит с оптимизацией, установленной на -O2.
Да, функция foo необходима для воспроизведения проблемы. Сначала это было очень странно, но я обнаружил, что сбой происходит только тогда, когда вызов push_back не встроен. Если GCC замечает, что метод push_back вызывается более одного раза, он не будет встроен в каждое место. Например, я также могу воспроизвести сбой, дважды вызвав push_back внутри main. Если вы сделаете foo статическим, то gcc может сказать, что он никогда не вызывается, и оптимизирует его, в результате чего push_back будет встроен в main, что приведет к сбою.
Я пробовал это на x86 с gcc 4.3.3, и, похоже, проблема исправлена для этой версии.
Итак, мои вопросы:
Кто-нибудь еще сталкивался с этим? Возможно, есть некоторые флаги компилятора, которые я могу передать, чтобы предотвратить это.
Это ошибка генерации кода в gcc или ошибка в реализации stl (bits / stl_bvector.h)? (Я планирую проверить это самостоятельно, когда у меня будет время)
Если это проблема с компилятором, обновление до 4.3.3, что это исправляет, или он переключается на x86 с руки?
Между прочим, большинство других vector<bool>
методов работают. И да, я знаю, что использование vector<bool>
не лучший вариант в мире.