Size: a a a

2020 June 22

VS

Vlad Serebrennikov in pro.cxx
vehlwn
Нулл поинтер константа - это интегральный литерал с значением 0 или nullptr.
не литерал, а константа
источник

v

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

VS

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

VS

Vlad Serebrennikov in pro.cxx
magras
Наоборот, теперь возникает проблема с тем, что структура с указателем будет инициализированна битовым нулем, который может быть не равен nullptr.
оно действительно выглядит как острый угол, но чтобы проверить поведение компиляторов, надо найти такой lifetime-implicit тип на такой платформе, чтобы nullptr не был нулем
источник

S

Serg in pro.cxx
Буквальное следование стандарту заставляет вместо программирования, придумывать почему что-то делать нельзя
хотя все делают
источник

ПК

Побитый Кирпич... in pro.cxx
Serg
Буквальное следование стандарту заставляет вместо программирования, придумывать почему что-то делать нельзя
хотя все делают
Это называется "написание кросс-платформенного/кросс-компиляторного кода". Раньше невежественные личности использовали volatile для атомарности, потому что в каком то компиляторе на какой то платформе это могло давать работающую программу. И таких реально много было (даже щас иногда залетают)
источник

S

Serg in pro.cxx
разве был когда volatile атомарным?
на популярных платформах не припомню
источник

ПК

Побитый Кирпич... in pro.cxx
Если прибить гвоздями версию компилятора и таргет платформу, то конечно можно любую дичь творить
источник

ПК

Побитый Кирпич... in pro.cxx
Serg
разве был когда volatile атомарным?
на популярных платформах не припомню
в msvc он вроде до сих пор какие то особые барьеры вставляет
источник

S

Serg in pro.cxx
Побитый Кирпич
в msvc он вроде до сих пор какие то особые барьеры вставляет
нет там барьеров. Смысл вполне определенный: что между 2-мя обращениями переменная может измениться
это не гарантирует атомарность на x86
источник

m

magras in pro.cxx
Serg
нет там барьеров. Смысл вполне определенный: что между 2-мя обращениями переменная может измениться
это не гарантирует атомарность на x86
По дефолту вроде до сих пор atomic: https://docs.microsoft.com/en-us/cpp/cpp/volatile-cpp?view=vs-2019
источник

ПК

Побитый Кирпич... in pro.cxx
Serg
нет там барьеров. Смысл вполне определенный: что между 2-мя обращениями переменная может измениться
это не гарантирует атомарность на x86
Я про это:
When the /volatile:ms compiler option is used—by default when architectures other than ARM are targeted—the compiler generates extra code to maintain ordering among references to volatile objects in addition to maintaining ordering to references to other global objects. In particular:

A write to a volatile object (also known as volatile write) has Release semantics; that is, a reference to a global or static object that occurs before a write to a volatile object in the instruction sequence will occur before that volatile write in the compiled binary.

A read of a volatile object (also known as volatile read) has Acquire semantics; that is, a reference to a global or static object that occurs after a read of volatile memory in the instruction sequence will occur after that volatile read in the compiled binary.

This enables volatile objects to be used for memory locks and releases in multithreaded applications.
источник

S

Serg in pro.cxx
да барьеры есть на не-x86 архитектурах, (в x86 они аппратные)
но этого не достаточно для семантики atomic
другое дело что любой atomic Должен быть volatile
источник

ПК

Побитый Кирпич... in pro.cxx
Serg
да барьеры есть на не-x86 архитектурах, (в x86 они аппратные)
но этого не достаточно для семантики atomic
другое дело что любой atomic Должен быть volatile
наоборот - по дефолту на x86 генерится доп код, который делает atomic семантику, а на ARM по дефолту используется ISO семантика volatile (то есть спец. память)
источник

S

Serg in pro.cxx
Побитый Кирпич
наоборот - по дефолту на x86 генерится доп код, который делает atomic семантику, а на ARM по дефолту используется ISO семантика volatile (то есть спец. память)
ну вот я только что проверил:
volatile int x;

void Foo() {
 ++x;
}

на Asm получилось:

  push  ebp
 mov  ebp, esp
; Line 4
 mov  eax, DWORD PTR ?x@@3HC      ; x
 add  eax, 1
 mov  DWORD PTR ?x@@3HC, eax      ; x
; Line 5
 pop  ebp
 ret  0
нету тут LOCK для atomic семантики
источник

S

Serg in pro.cxx
не видел ни одного компилятора где бы volatile были atomic
источник

VS

Vlad Serebrennikov in pro.cxx
Serg
нет там барьеров. Смысл вполне определенный: что между 2-мя обращениями переменная может измениться
это не гарантирует атомарность на x86
вы описали лишь частный случай. суть в другом
источник

S

Serg in pro.cxx
суть volatile в поддержке определенной семантики memory model
источник

ПК

Побитый Кирпич... in pro.cxx
Serg
ну вот я только что проверил:
volatile int x;

void Foo() {
 ++x;
}

на Asm получилось:

  push  ebp
 mov  ebp, esp
; Line 4
 mov  eax, DWORD PTR ?x@@3HC      ; x
 add  eax, 1
 mov  DWORD PTR ?x@@3HC, eax      ; x
; Line 5
 pop  ebp
 ret  0
нету тут LOCK для atomic семантики
Если компилить под ARM и выставить volatile:ms, то будут иснструкции
dmb         ish
источник

ПК

Побитый Кирпич... in pro.cxx
В ARM не шарю, но гуглится это как memory барьер
источник