LINUX.ORG.RU

Несколько flexible array member

 ,


0

2

Почему не добавят в стандарт, и какие приемы используют что бы реализовать это?

Описание того что я хочу:

struct String {
  int length;
  char str[length]; // == char str[];
                    // указание длинны, просто подсказка для компилятора
};

struct Item {
  struct String name; 
  struct String description;
  bool flag1, flag2, flag3;
  int elements_length;
  struct Element elements[elements_length]
};


// Item *i = malloc(999999999);
// (char*)&i->description.length == ((char*)&i->name.str) + i->name.length

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

★★★★★
Ответ на: комментарий от mittorn

Вам в managed языки, где всё делают за вас, а сборщик мусора аккуратненько подтирает вам попу...

Как данная проблема решается в managed языках?

Размер объекта изменится, но как ты предлагаешь об этом оповестить хранилище объекта? Место после объекта может быть чем-то занято

Точно такая же проблема может быть и с единичным flexible array member.

Попробуй реализовать «кортеж» с динамической длиной элементов сам.

Никаких сложностей с реализацией у меня нету, я просто хотел бы делать это удобнее.

MOPKOBKA ★★★★★
() автор топика
Ответ на: комментарий от MOPKOBKA

Как данная проблема решается в managed языках?

Не знаю решается ли где-то сейчас, но архитектурно можно было бы заменить объект на выделенный в другом месте, если бы он увеличился. Впрочем это не отличалось бы от вектора-кортежа с разными динамическими размерами элементов.

Точно такая же проблема может быть и с единичным flexible array member.

Потому его и не используют практически. Это малоприменимая технология и если тебе действительно нужно что-то такое хранить - сделай один flexible array и несколько string_view или подмассивов в нём (не забывая про выравнивание в случае, если это не char)

mittorn ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Как данная проблема решается в managed языках?

Никак, там используются бокснутые/референсные типы. Т.е. место под строку выделяется где-то отдельно, а не в самой структуре.

no-such-file ★★★★★
()