Рассмотрим следующую структуру:
struct Vector4D
{
union
{
double components[4];
struct { double x, y, z, t; } Endpoint;
};
};
Мне кажется, что я видел нечто подобное в структуре WinApi IPAddress.Идея состоит в том, чтобы дать мне возможность использовать компоненты массива как по индексу, так и по имени, например:
Vector4D v;
v.components[2] = 3.0;
ASSERT(v.Endpoint.z == 3.0) //let's ignore precision issues for now
В стандарте C ++ есть гарантия того, что на пустом месте не будетначало POD-структуры, то есть элемент x будет расположен прямо в начале структуры Endpoint.Хорошо до сих пор.Но я, похоже, не нахожу никаких гарантий того, что между x
и y
, или y
и z
и т. Д. Не будет пустого пространства или отступов, и т. Д. Я не проверилстандарт C99.
Проблема заключается в том, что если между элементами структуры Endpoint есть свободное пространство, идея не будет работать.
Вопросы:
Прав ли я, что действительно нет гарантии, что это будет работать ни в C, ни в C ++.
Будет ли это работать практическина любой известной реализации?Другими словами, знаете ли вы о какой-либо реализации, где это не работает?
Существует ли какой-либо стандартный (я имею в виду не зависящий от компилятора) способ выразить ту же идею?Может быть, функции выравнивания C ++ 0x могут помочь?
Кстати, это не то, чем я занимаюсь в производственном коде, не волнуйтесь, просто любопытно.Заранее спасибо.