РЕДАКТИРОВАТЬ: Добавлен вывод отладочной информации с местами памяти, как предложено PlasmaHH.
Я не понимаю различное поведение cl :: vector <> в привязках C ++ для OpenCL,Рассмотрим следующий код:
Заголовок Top.hpp
:
class Top {
public:
void setBool(bool b);
bool getBool();
private:
bool status;
};
Источник Top.cpp
:
#include "Top.hpp"
void Top::setBool(bool b) {
std::cout << (void*)this << " setBool("<< b<< ")\n";
status = b;
}
bool Top::getBool() {
std::cout << (void*)this << " getBool() returns " << status << std::endl;
return status;
}
Используйте приведенное выше:
#define __NO_STD_VECTOR
#include <iostream>
#include "CL/cl.hpp"
#include "Top.hpp"
using namespace cl;
using namespace std;
cl::vector<Top> js;
int main() {
js.push_back(Top());
js[0].setBool(true);
cout << js[0].getBool() << endl;
for(cl::vector<Top>::iterator i = js.begin(); i != js.end(); ++i) {
(*i).setBool(false);
}
cout << js[0].getBool() << endl;
}
При __NO_STD_VECTOR
std :: vector переопределяется.Выходные данные
0x6021c0 setBool(1)
0x6021c0 getBool() returns 1
0x7fffae671d60 setBool(0)
0x6021c0 getBool() returns 1
Таким образом, местоположение, возвращаемое итератором, определенно неверно.
Использование вышеприведенного с std::vector
(и, конечно, изменение пространств имен на std
) дает ожидаемый результат:
0x1be0010 setBool(1)
0x1be0010 getBool() returns 1
0x1be0010 setBool(0)
0x1be0010 getBool() returns 0
Этот итератор действует по-другому, но он должензаменить std :: vector, чтобы избежать проблем совместимости.Я что-то упустил?