У меня есть класс для представления трехмерного вектора поплавков:
class Vector3D
{
public:
float x, y, z;
float * const data;
Vector3D() : x(0.0), y(0.0), z(0.0), data(&x) {}
}
У меня вопрос: будут ли x, y и z размещаться последовательно в памяти, чтобы я мог присвоить адрес x данным, а затем использовать оператор индекса для данных для доступа к векторным компонентам как к массиву?
Например, иногда мне может понадобиться получить прямой доступ к векторным компонентам:
Vector3D vec;
vec.x = 42.0;
vec.y = 42.0;
vec.z = 42.0;
И иногда я могу захотеть получить к ним доступ по смещению:
Vector3D vec;
for (int i = 3; i--; )
vec.data[i] = 42.0;
Будет ли второй пример иметь тот же эффект, что и первый, или я рискую перезаписать память, отличную от чисел с плавающей запятой x, y и z?
Vector3D*
кfloat*
вызывает UB, как и запись в один член союза и чтение из другого. - person ildjarn   schedule 08.06.2011data(&x)
работает, покаdata
рассматривается как указатель на единственное числоfloat
, а не как указатель на массивfloat
. Ни одна из предложенных вами альтернатив не является законной С++. - person ildjarn   schedule 08.06.2011Vector3D*
кfloat*
разрешено. 9.2p20 Указатель на объект структуры стандартного макета, соответствующим образом преобразованный с использованием reinterpret_cast, указывает на его начальный элемент (или, если этот элемент является битовым полем, то на модуль, в котором он находится) и наоборот. - person Ben Voigt   schedule 08.06.2011