Std :: ground, когда есть два объекта в одном месте памятиC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Std :: ground, когда есть два объекта в одном месте памяти

Сообщение Anonymous »

Я прочитал некоторое чтение на std :: raunder < /code>, и я подумал о сценарии, который стандарт, казалось, не учитывает. p представляет адрес a байта в памяти
[*] Объект x находится на адресе a
[*] находится в пределах своей жизни
[*] Тип x такой же, что и T, игнорируя CV-квалификаторы на каждом уровне
[*] Каждый байт, который будет достижимы через результат, достижимый через p. Полем .

Тогда std :: raunder (p) Возвращает значение типа t*, который указывает на объект x . В противном случае, поведение не определено. Утилита в ситуациях, когда один объект погиб, а другой начал свою жизнь в память, и вам просто нужно рассказать об этом компилятору. Но если я правильно его читаю, std :: raunder можно использовать для более того.

Код: Выделить всё

struct S {
int i;

S(int i, int j) : i(i), j(j) {}

private:
int j;
};

int main() {
S s(10, 20);
int *pi = reinterpret_cast(&s);
int *pi_good = std::launder(pi);
}
В этом примере pi является int*, который указывает на местоположение памяти, где там живет int , но указатели не указывают на местоположения памяти; Они указывают на объекты. И поскольку in Reveterpret_cast не изменяет значение указателя (потому что s не является pointer-interconvertible с int ), pi все еще указывает на объект s . Таким образом, derefercring pi является неопределенным поведением. Именно здесь появляется std :: raunder , и это дает нам указатель на int , который на самом деле живет там. std :: raunder , чтобы переключиться с одного на другое и назад *.
(это также означало бы, что std :: rainderpret_cast (std :: rand ())

Код: Выделить всё

#include 

struct Holder {
// unsigned char required to provide storage
unsigned char storage[4];

// make it a non-trivial type
~Holder() {};

template 
void hold() {
::new(static_cast(storage)) T;
}
};

int main() {
Holder h;
h.hold();
Holder *ph = &h;
[[maybe_unused]] Holder *ph_laundered = std::launder(ph);
}
В этом примере как держатель , так и удерживающий объект в прямом эфире в одном и том же месте памяти одновременно и имеют одинаковый тип.
*Последняя пуля в одном int путем изменения s на класс s {int i; }; где я является частным.

Подробнее здесь: https://stackoverflow.com/questions/797 ... y-location
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Std :: ground, когда есть два объекта в одном месте памяти
    Anonymous » » в форуме C++
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Является ли утверждение этого CPPREF устаревшим на типичном использовании STD :: Ground?
    Anonymous » » в форуме C++
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Достижимость со STD :: Ground
    Anonymous » » в форуме C++
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Достижимость со STD :: Ground
    Anonymous » » в форуме C++
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Std :: ground до динамического массива?
    Anonymous » » в форуме C++
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»