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 ())

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

struct Holder {
char storage[4];

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

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

int main() {
Holder h;
h.hold();
Holder *ph = &h;
Holder *ph_laundered = std::launder(ph);
}
В этом примере как держатель , так и удерживающий объект живут в одном и том же местоположении памяти одновременно. 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 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Является ли утверждение этого CPPREF устаревшим на типичном использовании STD :: Ground?
    Anonymous » » в форуме C++
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Достижимость со STD :: Ground
    Anonymous » » в форуме C++
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Достижимость со STD :: Ground
    Anonymous » » в форуме C++
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Std :: ground до динамического массива?
    Anonymous » » в форуме C++
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous

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