Я нашел некоторый код и хочу убедиться, что я правильно понимаю.Вариант использования - это упакованное изображение, которое представлено массивом значений.В этом примере три значения представляют один пиксель.
Код, который я нашел, выглядит примерно так:
struct Pixel{
int[3] data
int x(){return data[0];}
int y(){return data[1];}
int z(){return data[2];}
};
void main(){
std::vector<int> img(300);
Pixel* access = reinterpret_cast<Pixel*>(img.data()+3*5);
foo(access->x());
}
Как я понял из чтения POD и стандартного макета , ядумаете, пример кода верен, потому что мы используем только первый член Pixel?Тогда замена Pixel на
struct Pixel2{
int red;
int green;
int blue;
};
приведет к неопределенному поведению?
Редактировать: я работаю с cuda и нашел другой пример: приведение и беззнаковый указатель char (массив) к указателю uchar3.Определение типа uchar3 равно определению второго пикселя.Значит ли это, что второе тоже верно?Или это работает только для кода, скомпилированного nvcc?Если второе определение Pixel является действительным, то почему?
Редактировать: Чтобы еще раз подчеркнуть, что код пытается сделать, я переименовал некоторые поля выше: у меня есть массив необработанных данных.В моем случае это упакованное изображение.Я хочу иметь хороший способ доступа к пикселям и их значениям.Так что я могу сделать что-то вроде этого:
void bar(int* data,size_t size)
{
Pixel2* img = reinterpret_cast<Pixel*>(data);
std::cout << "Pixel 13 has blue value: " << img[13].blue;
}
Я видел код, использующий это в cuda, и он работал, но я хочу знать, все ли в порядке, так как он, кажется, не охватывается тем, о чем я читалпорт назначенияЯ просто что-то упустил из-за POD или это что-то, что может дать сбой?
Редактировать: Есть ли разница между:
foo(access->x());
foo(access->data[0]);
Я думал, что секунда должна быть законной, поскольку для типов PODПервая переменная-член имеет тот же адрес, что и объект?
Редактировать: Что я беру из ответов: это UB во всех случаях, которые я упомянул.Тогда можно было бы использовать итератор с произвольным доступом, который дает мне доступ, который мне нужен.