Size: a a a

2020 June 22

AT

Andrew Titov in pro.cxx
Vlad Serebrennikov
An object has a type
Это из определения объекта?
источник

VS

Vlad Serebrennikov in pro.cxx
Andrew Titov
Это из определения объекта?
источник

v

vehlwn in pro.cxx
magras
Наверное, достаточно написать static_assert((uintptr_t)nullptr == 0); и тогда можно инициализировать указатели битовым нулем. То есть мне кажется, перевели из UB в implementation defined.
Ошибка в слове "инициализировать битовым нулем", потому что все интегральные нули битовые и не инициализировать,  а конвертировать.
источник

v

vehlwn in pro.cxx
При чем тут валуев презентация нулл поинтер валуева? Лучше найдите, почему его нельзя разыменовывать.
источник

S

Serg in pro.cxx
magras
Наверное, достаточно написать static_assert((uintptr_t)nullptr == 0); и тогда можно инициализировать указатели битовым нулем. То есть мне кажется, перевели из UB в implementation defined.
Iimplementation-defined оно было со времен стандарта C (вместо nullptr было NULL)
очевидно взаимное преобразование  nullptr должен иметь то же битовое представилние что nULL
источник

AT

Andrew Titov in pro.cxx
И всё-таки мне кажется, что до первого подходящего каста компилятор не знает, какого типа объект был аллоцирован. А если указатель скастовали к нетривиальному типу, то это приведёт к UB, т.к. момент для инициализации объекта в общем случае сложно подловить.
источник

m

magras in pro.cxx
magras
struct S {
 void* p;
};

S* s = reinterpret_cast<S*>(calloc(sizeof(int))); // note this memory guaranteed to be filled with zeros
assert(s->p == nullptr);

Такой код был UB. В 20ом стандарте UB нет, но срабатывание assert'а зависит от битового представления nullptr.
Речь идет об этом коде. Здесь происходит каст зануленного массива к структуре содержащей указатель.

На счет инициализации, да, я неудачно выразился.
источник

v

vehlwn in pro.cxx
magras
Речь идет об этом коде. Здесь происходит каст зануленного массива к структуре содержащей указатель.

На счет инициализации, да, я неудачно выразился.
Не существует никакой битовой презентации нулл поинтер валуева.
источник

m

magras in pro.cxx
vehlwn
Не существует никакой битовой презентации нулл поинтер валуева.
Описание calloc:
> Allocates memory for an array of num objects of size size and initializes it to all bits zero.
источник

v

vehlwn in pro.cxx
Каллоков тоже не существует. Их придумали сишники, чтобы пропагандировать уб.
источник

m

magras in pro.cxx
vehlwn
Каллоков тоже не существует. Их придумали сишники, чтобы пропагандировать уб.
Тем не менее, стандарт С++ инклюдит часть хэдеров из стандарта си.
источник

m

magras in pro.cxx
источник

AN

Alexander N in pro.cxx
Побитый Кирпич
Там где 0 это валидный адрес и по нему можно алоцировать объект. Обращение к такому объекту, если б null pointer был бы строго равен 0 адресу было бы невозможно по стандарту (было бы UB).
Это скорее там где явно можно адресовать память. Специфичные платформы
источник

VS

Vlad Serebrennikov in pro.cxx
magras
Наверное, достаточно написать static_assert((uintptr_t)nullptr == 0); и тогда можно инициализировать указатели битовым нулем. То есть мне кажется, перевели из UB в implementation defined.
если следовать букве стандарта, то это проверка говорит лишь о том, что для uintptr_t nullptr имеет представление 0. представление nullptr для всех остальных типов она никак не затрагивает
источник

S

Serg in pro.cxx
весь этот nullptr был придуман только чтобы не путать тип с целочисленным 0
источник

AN

Alexander N in pro.cxx
А сравнение указателя с 0 вообще может быть валидным? Предполагая, что есть legacy, где используется NULL
источник

S

Serg in pro.cxx
Alexander N
А сравнение указателя с 0 вообще может быть валидным? Предполагая, что есть legacy, где используется NULL
да, 0 преобразуется в 'null pointer' соответсующего типа и так сравнивается
источник

ПК

Побитый Кирпич... in pro.cxx
Serg
весь этот nullptr был придуман только чтобы не путать тип с целочисленным 0
null pointer как абстрактная сущность стандарта был всегда. Вопрос чему он равен при касте к инту (по стандарту там нет гарантии, что будет 0)
источник

v

vehlwn in pro.cxx
Alexander N
А сравнение указателя с 0 вообще может быть валидным? Предполагая, что есть legacy, где используется NULL
Нулл поинтер константа - это интегральный литерал с значением 0 или nullptr.
источник

ПК

Побитый Кирпич... in pro.cxx
Побитый Кирпич
null pointer как абстрактная сущность стандарта был всегда. Вопрос чему он равен при касте к инту (по стандарту там нет гарантии, что будет 0)
Что там на конкретных платформах уже не важно
источник