σ>>Почему, например, вызываемая функция не могла угадать адрес аргумента или локальной переменной вызывающей функции, без прямой передачи ей указателя на них или без записи такого указателя в глобальную переменную и т.п.? Вроде этот пассаж разрешает. Хоть из /dev/random считать биты и слепить из них значение указателя.
A>Почему ж не могла? Могла. Только вот компилятор не обязан на такое не закладываться, когда код функции генерит. И правильно делает имхо, предположение о том, что в функцию приходит указатель на объект, а не хитро сконструированный мусор, достаточно разумно.
Не знаю, откуда взялись функции в которые что-то "приходит".
Ладно, попробую ещё раз объяснить.
Есть код
int f() { int i = 0; g(); return i; }
Может ли компилятор соптимизировать тело до `g(); return 0;` и почему? Вроде как тот пассаж из стандарта говорит, что `g()` может угадать адрес `i` (и, следовательно, изменить значение).
Здравствуйте, σ, Вы писали:
σ>А для легальности арифметики с полученным указателем `sizeof(Count) == sizeof (int)` значения не имеет. Она нелегальна в любом случае.
Как могла бы работать функция memcpy, которая копирует структуру через нетипизированный указатель и размер в другую структуру?
Или такую функцию реализовать средствами С++ невозможно?
Здравствуйте, Шахтер, Вы писали:
Ш>Aliasing объекта и его члена легален.
Да, уже разобрался. Тут не алиасинг легален, а его просто нет. Для SLT указатели на первый член и структуру interconvertible, поэтому там object accessed получается не структура, а именно первый член и тогда dynamic type == aliased type.
σ>Не знаю, откуда взялись функции в которые что-то "приходит".
В данном случае про аргумент речь шла, так что ты не можешь получить адрес объекта, который еще не появился в стеке, и передать его в функцию. Сначала должен быть объект, а уж указатель на него ты можешь out of thin air получить. То, что ты получишь из /dev/random, указателем на объект не является, так как объекта еще нет.
σ>Ладно, попробую ещё раз объяснить. σ>Есть код σ>
σ>int f() { int i = 0; g(); return i; }
σ>
σ>Может ли компилятор соптимизировать тело до `g(); return 0;` и почему? Вроде как тот пассаж из стандарта говорит, что `g()` может угадать адрес `i` (и, следовательно, изменить значение).
Здесь обратная ситуация, объект уже есть.
Имхо может, хоть я и не бог весть какой законник. По "as_if rule". Твой int не volatile, так что прога может и не посчитать запись в него в g() "observable behavior". Здесь стандарт много на волю реализации отдает. Если возможностей судить о g() у компилятора нет, то он оставит все как есть.
A>В данном случае про аргумент речь шла, так что ты не можешь получить адрес объекта, который еще не появился в стеке, и передать его в функцию.
Перечитай ещё раз то моё сообщение. Словесное описание совпадает с кодом, который я запостил позже.
A> Сначала должен быть объект, а уж указатель на него ты можешь out of thin air получить.
Не можешь. Это был бы кошмар для оптимизаций.
σ>>Ладно, попробую ещё раз объяснить. σ>>Есть код σ>>
σ>>int f() { int i = 0; g(); return i; }
σ>>
σ>>Может ли компилятор соптимизировать тело до `g(); return 0;` и почему? Вроде как тот пассаж из стандарта говорит, что `g()` может угадать адрес `i` (и, следовательно, изменить значение).
A>Здесь обратная ситуация, объект уже есть.
Это код, который я описывал словами.
A>Имхо может, хоть я и не бог весть какой законник. По "as_if rule". Твой int не volatile, так что прога может и не посчитать запись в него в g() "observable behavior".
Какая-то странная логика. Так и `int i = 0; i = 2; return i;` можно соптимизировать до `return 0;`, а чо, запись двойки это не "observable behavior".
A> Здесь стандарт много на волю реализации отдает. Если возможностей судить о g() у компилятора нет, то он оставит все как есть.
Так ведь не оставляет, а оптимизирует
Здравствуйте, σ, Вы писали:
A>>В данном случае про аргумент речь шла, так что ты не можешь получить адрес объекта, который еще не появился в стеке, и передать его в функцию. σ>Перечитай ещё раз то моё сообщение. Словесное описание совпадает с кодом, который я запостил позже.
Понял, ты изначально говорил о ситуации, про которую потом код привел. Невнимателен, виноват, думал что разговор всё еще про то, что аргумент функции не может алиасить на локальную переменную.
A>> Сначала должен быть объект, а уж указатель на него ты можешь out of thin air получить. σ>Не можешь. Это был бы кошмар для оптимизаций.
Так вроде твоя ж была цитата как раз про то, что указатель на валидный объект может быть ЛЮБЫМ способом рассчитан Абы б он указывал действительно на валидный существующий объект.
A>>Имхо может, хоть я и не бог весть какой законник. По "as_if rule". Твой int не volatile, так что прога может и не посчитать запись в него в g() "observable behavior". σ>Какая-то странная логика. Так и `int i = 0; i = 2; return i;` можно соптимизировать до `return 0;`, а чо, запись двойки это не "observable behavior". A>> Здесь стандарт много на волю реализации отдает. Если возможностей судить о g() у компилятора нет, то он оставит все как есть. σ>Так ведь не оставляет, а оптимизирует
Говорю ж, не знаю что точно подразумевается под observable behavior. В стандарте так написано, что фактически надо сравнить выполнение оптимизированной и неоптимизированной проги на абстрактной машине, что само по себе смехотворно.
Здравствуйте, Alexander G, Вы писали:
AG>А в локальную переменную.
AG>Осталась привычка со времён, когда до изобретения атомиков думали, что int мембер тоже атомик.
AG>И продолжает помогать.
AG>
AG>struct Count
AG> {
AG> int val;
AG> void sum(PtrLen<const int> r)
AG> {
AG> int tmp_val=0;
AG> for(int v : r ) tmp_val+=v;
AG> val = tmp_val;
AG> }
AG> }
AG>
Я тоже так делаю, когда сильно озабочен производительностью.
σ>>А для легальности арифметики с полученным указателем `sizeof(Count) == sizeof (int)` значения не имеет. Она нелегальна в любом случае.
AG>Как могла бы работать функция memcpy, которая копирует структуру через нетипизированный указатель и размер в другую структуру? AG>Или такую функцию реализовать средствами С++ невозможно?
Здравствуйте, σ, Вы писали:
AG>>Как могла бы работать функция memcpy, которая копирует структуру через нетипизированный указатель и размер в другую структуру? AG>>Или такую функцию реализовать средствами С++ невозможно? σ>Да, невозможно.
AG>>>Как могла бы работать функция memcpy, которая копирует структуру через нетипизированный указатель и размер в другую структуру? AG>>>Или такую функцию реализовать средствами С++ невозможно? σ>>Да, невозможно. AD>Это почему?
Недостаточно C++-средств для реализации memcpy.
Здравствуйте, σ, Вы писали:
AG>>>>Как могла бы работать функция memcpy, которая копирует структуру через нетипизированный указатель и размер в другую структуру? AG>>>>Или такую функцию реализовать средствами С++ невозможно? σ>>>Да, невозможно. AD>>Это почему? σ>Недостаточно C++-средств для реализации memcpy.
AG>>>>>Как могла бы работать функция memcpy, которая копирует структуру через нетипизированный указатель и размер в другую структуру? AG>>>>>Или такую функцию реализовать средствами С++ невозможно? σ>>>>Да, невозможно. AD>>>Это почему? σ>>Недостаточно C++-средств для реализации memcpy. AD>Вот я и спрашиваю, чего именно не хватает?
См. это. (Правда, там вроде wording протух, а новая ревизия пока не в открытом доступе).
Ну или https://rsdn.org/forum/cpp/7312471?tree=tree
Для private полей, вроде как таких гарантий нет. И структура с private вроде бы не POD же?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Типа, если вообще все нестатические поля private, то можно?
Прикольное правило
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском