Таким образом, вполне законны ситуации типа sizeof(char)>sizeof(long).
Не бывает так.
n1570, 6.2.5p8:
For any two integer types with the same signedness and different integer conversion rank
(see 6.3.1.1), the range of values of the type with smaller integer conversion rank is a
subrange of the values of the other type.
6.3.1.1p1:
The rank of long long int shall be greater than the rank of long int, which
shall be greater than the rank of int, which shall be greater than the rank of short
int, which shall be greater than the rank of signed char.
Стандарт — один из основных документов, которым я руководствуюсь в своей деятельности.
Меня всегда удивляет как «чтение стандарта вслух» вызывает восторженные и удивлённые возгласы «да вы что?», «не может быть!» даже у senior программистов Си.
А ещё Atlas выполняет множество других измерений для различных экспериментов. Например, Atlas был одним из ключевых в измерении доступности сайтов в IPv6 Day.
В x86 реализован total store ordering, поэтому проблемы там совсем не так ярко выражены как на других платформах.
А out-of-order execution не совсем к месту. Процессор может быть OOO, но с различными store buffer, которые всё поставит в «правильном» порядке с точки зрения программиста.
В такой формулировке — соглашусь. И я никогда не говорил что checked STL — плохая вещь как концепция.
Просто меня задела фраза:
> На дебаг режим это не распространяется.
Которая подразумевает что для дебаг-режима есть какие-то особые требования conformance.
Требования стандарта не делятся на требования семантики, эффективности и ещё какие-то. Они все равноправны с точки зрения conformance. И если дебаг-проверки превращают мой nlogn алгоритм, использующий lower_bound в нереальный n^2, который не завершится в ближайший час даже на тестовых данных — то это баг реализации.
Мне почему-то кажется что я его читал побольше вашего…
[expr.eq]p1:
Two pointers of the same type compare equal if and only if they are both null, both point to the same function, or both represent the same address (3.9.2).
[basic.compound]p3:
A valid value of an object pointer type represents either the address of a byte in memory (1.7) or a null pointer (4.10).
[intro.memory]p1:
Every byte has a unique address.
> Какого размера указатель на x86? Старом x86, 16 битном, с сегментными регистрами. Чтобы полностью адресовать дынные нужно хранить и значение регистра и смещение от начала сегмента.
Исходя из цитат, приведённых выше, этот подход не соответствует стандарту. Каждый байт должен иметь уникальный адрес, который хранится в указателе. Полноценным указателем может считаться только far pointer.
> Они могут оказаться равными даже если указывают на разные области памяти
Так быть не может никогда.
А вот что может быть: malloc() и realloc() по стандарту возвращает указатель на новый объект, который отличается от остальных указателей. Поэтому компилятор может во время оптимизации считать что все области памяти не алиасятся и спокойно делать store forwarding как в этом примере:
Совет на миллион: почитайте, наконец, стандарт C++ (про итераторы, контейнеры и undefined behavior) и перестаньте удивляться задокументированному и логичному поведению языка (при условии что вы знаете правила игры, описанные в стандарте). Если вы находитесь на уровне «написать аналог std::vector» то ни Хабр, ни Вивипедия, при всём уважении, не могут быть авторитетными источниками.
Не бывает так.
n1570, 6.2.5p8:
6.3.1.1p1:
Меня всегда удивляет как «чтение стандарта вслух» вызывает восторженные и удивлённые возгласы «да вы что?», «не может быть!» даже у senior программистов Си.
А out-of-order execution не совсем к месту. Процессор может быть OOO, но с различными store buffer, которые всё поставит в «правильном» порядке с точки зрения программиста.
2. Уж лучше наверное на m4 или на python сгенерировать всё что нужно…
Просто меня задела фраза:
> На дебаг режим это не распространяется.
Которая подразумевает что для дебаг-режима есть какие-то особые требования conformance.
И снова нет! Он определён в случае если два указателя указывают в один и тот же объект. [expr.rel]
Но это не важно, вы-то говорили про строгое равенство:
> Они могут оказаться равными даже если указывают на разные области памяти.
Мне почему-то кажется что я его читал побольше вашего…
[expr.eq]p1:
[basic.compound]p3:
[intro.memory]p1:
> Какого размера указатель на x86? Старом x86, 16 битном, с сегментными регистрами. Чтобы полностью адресовать дынные нужно хранить и значение регистра и смещение от начала сегмента.
Исходя из цитат, приведённых выше, этот подход не соответствует стандарту. Каждый байт должен иметь уникальный адрес, который хранится в указателе. Полноценным указателем может считаться только far pointer.
Hint: его нет. В стандарте вообще нет термина «дебаг режим».
Так быть не может никогда.
А вот что может быть: malloc() и realloc() по стандарту возвращает указатель на новый объект, который отличается от остальных указателей. Поэтому компилятор может во время оптимизации считать что все области памяти не алиасятся и спокойно делать store forwarding как в этом примере:
— blog.regehr.org/archives/767
pastebin.com/U2eEhcjY
Только первая функция (достаточно чтобы увидеть результат). Изменения исходного кода — добавил квалификатор restrict:
Команды: