Как позволить компилятору выполнять вычисления смещения для нечетной структуры полиморфизма с как можно меньшим количеством кода? - PullRequest
3 голосов
/ 30 мая 2019

Я не уверен, возможно ли это вообще в стандарте C ++, поэтому, возможно ли это сделать, может быть второстепенным способом поставить мой вопрос.

У меня есть эти двоичные данные, которые я хочучитать и создавать заново, используя структуры.Эти данные изначально создаются как поток с контентом, добавляемым в буфер, поле за полем за раз;ничего особенного в этом нет.Я мог бы просто прочитать это как поток, так же, как это было написано.Вместо этого я просто хотел посмотреть, возможно ли позволить компилятору выполнить для меня математику, и вместо этого реализовать двоичные данные в виде структуры данных.

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

Простой пример

struct Common {
    int length;
};

struct Boo {
    long member0;
    char member1;
};

struct FooSimple : Common {
    int count;
    Boo boo_list[];
};

char buffer[1024];
int index = 15;
((FooSimple *)buffer)->boo_list[index].member0;

Расширенный пример

struct Common {
    int length;
};

struct Boo {
    long member0;
    char member1;
};

struct Goo {
    int count;
    Boo boo_list[];
};

struct FooAdvanced : Common {
    int count;
    Goo goo_list[];
};

char buffer[1024];
int index0 = 5, index1 = 15;
((FooAdvanced *)buffer)->goo_list[index0].boo_list[index1].member0;

Примеры не должны быть связаны.Я повторно использовал некоторый код из-за недостатка креативности для уникальных имен.

Для простого примера в этом нет ничего необычного.Структура Boo имеет фиксированный размер, поэтому компилятор может просто выполнять вычисления, чтобы достичь поля member0.

Для продвинутого примера, насколько я могу судить по крайней мере, это не так тривиальнодела.Проблема, которую я вижу, состоит в том, что если я использую оператор селектора массива для выбора объекта Goo из встроенного массива Goo-элементов (goo_list), компилятор не сможет правильно выполнять вычисления смещения, если он не сделает некоторые предположения;возможно, предполагая, что все предшествующие Goo-элементы в массиве имеют нулевые Boo-элементы во встроенном массиве (boo_list) или какое-либо другое постоянное значение.Естественно, этого не произойдет.

Вопрос (ы):

  1. Какие существуют способы достижения вычислений смещения, которые должны быть выполненыкомпилятор, несмотря на то, что встроенные массивы имеют переменную длину?Если я что-то упустил, я думаю, что шаблоны не могут помочь вообще, из-за их природы во время компиляции.
  2. Возможно ли это даже достичь в C ++?
  3. Как вы справляетесь св случае создания экземпляра объекта FoodAdvanced путем подачи переменного числа элементов Goo и Boo в члены goo_list и boo_list соответственно?
  4. Если это невозможно, придется ли мне писать какой-нибудь код-обертку для обработкивместо расчетов?
...