Именование элементов массива или структура и массив внутри объединения

Рассмотрим следующую структуру:

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 есть пустое пространство, идея не сработает.

Вопросы :

  1. Я прав в том, что на самом деле нет никакой гарантии, что это будет работать ни на C, ни на C ++.

  2. Будет ли это работать практически на любой известной реализации? Другими словами, знаете ли вы о какой-либо реализации, в которой это не работает?

  3. Есть ли какой-нибудь стандартный (я имею в виду не зависящий от компилятора) способ выразить ту же идею? Может быть, функции выравнивания 0x в C ++ могут помочь?

Между прочим, я не делаю этого в производственном коде, не волнуйтесь, просто любопытно. Заранее спасибо.

10
задан timrau 15 August 2012 в 17:12
поделиться