Рассмотрим следующую структуру:
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 не будет «пустого» места. struct, то есть элемент x будет расположен прямо в начале структуры Endpoint. Хорошо до сих пор. Но я, похоже, не нахожу никаких гарантий, что не будет пустого пространства или заполнения, если хотите, между x
и y
или y
и z
и т. Д. Я не проверял стандарт C99.
Проблема в том, что если между элементами структуры Endpoint есть пустое пространство, идея не сработает.
Вопросы :
Я прав в том, что на самом деле нет никакой гарантии, что это будет работать ни на C, ни на C ++.
Будет ли это работать практически на любой известной реализации? Другими словами, знаете ли вы о какой-либо реализации, в которой это не работает?
Есть ли какой-нибудь стандартный (я имею в виду не зависящий от компилятора) способ выразить ту же идею? Может быть, функции выравнивания 0x в C ++ могут помочь?
Между прочим, я не делаю этого в производственном коде, не волнуйтесь, просто любопытно. Заранее спасибо.