170 похожих чатов

Почему в реализации template <class _Tp> struct array<_Tp, 0> массив

элементов определяется следующим образом?

typedef __conditional_t<is_const<_Tp>::value, const char, char> _CharType;
struct _ArrayInStructT { _Tp __data_[1]; };
_ALIGNAS_TYPE(_ArrayInStructT) _CharType __elems_[sizeof(_ArrayInStructT)];

В libstdc++ он определен интереснее: это вовсе не массив, а пустой тип с перегруженным operator[] и operator _Tp*, но в общем получается так, что sizeof(std::array<int, 0>) в libc++ это 4 байт, а в libstdc++ это 1 байт.

Я просмотрел всю историю коммитов в <array> (libc++), но так и не понял, как смысл в том, что __data_ в _ArrayInStructT это _Tp, а не просто например какой-нибудь char, в чем прикольчик?
Равно как и не понимаю смысл тестов, что sizeof(std::array<T, 0>) должен быть равен sizeof(T[1]), таки почему, какой смысл?

Придерживаюсь мнения, что я что-то упускаю.

5 ответов

26 просмотров

чтобы все специализации array обладали некоторыми гарантиями, например .data возвращает не nullptr, возвращает уникальный адрес, так то алигненный и тд

Eoan-Ermine Автор вопроса
Kelbon
чтобы все специализации array обладали некоторыми ...

Кажется, будто дело не в этом. Значение data() unspecified, и в libc++ реализации этот __elems_ так то никак и не трогается в специализации для size == 0. В реализации от libstdc++ вовсе нет никаких alignas. Пролистываю стандарт — не понимаю, смотрю на соседнюю реализацию — тоже не понимаю, откуда они его выдумали, и зачем делают массив нулевой длины размеров в массив единичной длины.

Eoan-Ermine Автор вопроса
Eoan Ermine
Кажется, будто дело не в этом. Значение data() uns...

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

Eoan Ermine
Видимо, это какая-то глупость, чудом сохранившаяся...

Заслать патч можно, но примут вряд ли - изменение layout'а ломает ABI. Но выяснить, почему исторически именно так - хорошая мысль

Alexander Karaev
Заслать патч можно, но примут вряд ли - изменение ...

Какой патч? Исторически вообще любой объект не нулевой длины :)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта