Что такое Идиома завершающего массива?
P.S. При поиске в Google этот термин дает Векторы реализованы с использованием идиомы конечного массива, поэтому их размер нельзя изменить без изменения адреса самого векторного объекта.
Что такое Идиома завершающего массива?
P.S. При поиске в Google этот термин дает Векторы реализованы с использованием идиомы конечного массива, поэтому их размер нельзя изменить без изменения адреса самого векторного объекта.
Если вы имеете в виду идиому завершающего массива, упомянутую в исходном коде GCC (откуда ваша цитата), похоже, это ссылка на старый трюк C для реализации динамического массива:
typedef struct {
/* header */
size_t nelems;
/* actual array */
int a[1];
} IntVector;
где массив будет создан с
IntVector *make_intvector(size_t n)
{
IntVector *v = malloc(sizeof(IntVector) + sizeof(int) * (n-1));
if (v != NULL)
v->nelems = n;
return v;
}
struct hack
использовался бы вместо Trailing array idiom
.
- person Prasoon Saurav; 20.11.2010
:)
- person Prasoon Saurav; 20.11.2010
sizeof
...
- person Matthieu M.; 20.11.2010
Кажется, это относится к массивам в структурах, которые могут иметь переменный размер массива. Видеть:
http://blogs.msdn.com/b/oldnewthing/archive/2004/08/26/220873.aspx и http://sourceware.org/gdb/current/onlinedocs/gdbint/Support-Libraries.html
Еще один совет: если вы погуглите выражение, поместите выражение в «», например «конечный массив», это даст вам более конкретные результаты. Google знает о конечных массивах.
Я думаю, что имеется в виду:
struct foo {
... some data members, maybe the length of bar ...
char bar[]; /* last member of foo, char is just an example */
};
Он используется путем выделения с помощью malloc(sizeof(struct foo)+LEN)
, где LEN — желаемая длина bar
. Таким образом, требуется только один malloc. []
можно использовать только с последним элементом структуры.
И, насколько я понимаю документ GCC, struct foo
также может (разумно) использоваться только как последний член другой структуры, потому что размер хранилища не фиксирован - или как указатель.