170 похожих чатов

Есть указатель, который вмещает в себя адрес памяти, количество байтов

которое занимает переменная и ее тип. Почему я не могу сказать укзателю, что теперь по этому адресу int, а не double?

57 ответов

23 просмотра

Потому что это нарушение strict aliasing

Потому что изначально вы положили в коробку котенка, а теперь говорите компилятору, что там сидит щенок) Вот компилятор и ругается

Пашечка
Потому что изначально вы положили в коробку котенк...

Компилятор бы не ругался, не будь это каст с проверкой. Но даже без проверки это UB

Liber Azerate
Компилятор бы не ругался, не будь это каст с прове...

Ну, про реинтерпрет я упомянул чуть выше)

Nastya-Medveda Автор вопроса
Liber Azerate
Компилятор бы не ругался, не будь это каст с прове...

А вот если я то же самое оберну в класс и сделаю dynamic_cast, то это сработает?

Nastya Medveda
А вот если я то же самое оберну в класс и сделаю d...

dynamic_cast только для кастов вверх/вниз по иерархии

Nastya Medveda
А вот если я то же самое оберну в класс и сделаю d...

dynamic_cast имеет не то предназначение. Он имеет предназначение перемещения по полиморфной иерархии. Если в базовом класе будет инт, например, а в наследнике будет поле с даблом, ну и это будут полиморфные классы, то сработает

Nastya Medveda
А вот если я то же самое оберну в класс и сделаю d...

Стопстопстоп, не путайте теплое с мягким. Во-первых, динамик каст тоже каст с проверкой. Только проверка в рантайме. А статик каст проверяет на этапе компиляции. Во-вторых, он используется, в основном, для преобразования от родителя к наследнику (или наоборот, но там и статик так-то работает)

Nastya-Medveda Автор вопроса
Liber Azerate
dynamic_cast имеет не то предназначение. Он имеет ...

ТО есть изменить тип указателя с int на double я не могу, но если я оберну обе переменных в классы и унаследую один класс от другого, то никаких проблем... Логичный подход. не придерешься.

Max Kolesnikov
Это как?

Легче загуглить, я тут не нарисую. Но к примеру, у класса два интерфейса, а мы из левого кастуем в правый

Nastya Medveda
ТО есть изменить тип указателя с int на double я...

Да, и в классе наследнике будет поле с указателем на инт и с указателем на дабл

Liber Azerate
Легче загуглить, я тут не нарисую. Но к примеру, у...

Это уже надо самописные касты, нет? Динамик не даст так сделать?

Nastya-Medveda Автор вопроса
Пашечка
Потому что изначально вы положили в коробку котенк...

А если у нее коробка с дырявым дном и она котенка на щенка поменяла?

Liber Azerate
Интерфейсов

Что-то вроде такого? struct C : A, B {} A * a = new C(); B * b = dynamic_cast<B*>(a);

Liber Azerate
Да

Интересно, спасибо, не задумывался об этом никогда

Пашечка
Это UB :)

Либо очень тонкий расчет

Nastya-Medveda Автор вопроса
Liber Azerate
dynamic_cast имеет не то предназначение. Он имеет ...

Погодите, если я в наследнике сделаю оверрайд функции или переменной, то там будет зарезервировано место для переменной из базового класса тоже?

Nastya Medveda
Погодите, если я в наследнике сделаю оверрайд функ...

Оверрайд переменной сделать нельзя. И да, в наследнике будет содержаться база

Потому что в памяти С++ лежат объекты, а не байты

Nastya-Medveda Автор вопроса
Constantine Drozdov
Потому что в памяти С++ лежат объекты, а не байты

Хорошо. Скажите, если я создаю int array традиционным способом: int array[5] = {1, 2, 3, 4, 5}; и создаю его же с помощью оператора new int* array = new int[5]{1, 2, 3,4 ,5}; это одинаковые по структуре объекты?

Nastya Medveda
Хорошо. Скажите, если я создаю int array традици...

Нужно различать объект от его хранилища. Объекты одинаковые, да. При этом storage duration в одном случае автоматический, в другом динамический

Nastya-Medveda Автор вопроса
Constantine Drozdov
Нужно различать объект от его хранилища. Объекты о...

отлично. Теперь я передаю первый array в функцию. void myfunction(int array[]) {} myfunction(array) то почему в функцию приходит только указатель на первый элемент? Где остальное?

Nastya Medveda
отлично. Теперь я передаю первый array в функцию. ...

Потому что массив - это указатель на первый элемент.

Nastya Medveda
отлично. Теперь я передаю первый array в функцию. ...

А вот это уже сишное наследие. С точки зрения языка си, запись int array[] в аргументе функции означает передачу "по указателю", а передачи массива по значению в си нет. Если вместо этого вы будете использовать std::array<int, 5>, массив будет скопирован

Nastya Medveda
отлично. Теперь я передаю первый array в функцию. ...

Из языка Си в С++ есть особые случаи, связанные с типами в аргументах и возвращаемых значениях функции

Nastya-Medveda Автор вопроса
Пашечка
Потому что массив - это указатель на первый элемен...

Хорошо, но почему тогда в случае статического массива я могу итерировать по элементам не боясь выйти за пределы массива for(int aNumber : array) а при указателе на массив мне нужно отдельно таскать еще и размер массива? Как такое может быть если это одинаковые объекты?

Anatoly Shirokov
Это бан

Ок :3 пните, как можно возвращаться :3

Anatoly Shirokov
Это бан

Окей. В каких случаях массив не может скаститься до указателя на 1-й элемент массива?

Nastya Medveda
Хорошо, но почему тогда в случае статического масс...

В первом случае вы работаете с объектом типа массив, во втором - с указателем на элемент

Пашечка
Ок :3 пните, как можно возвращаться :3

Мы проводим статопрос перед умерщвлением плоти. Кто эту дичь вам сказал про указатель?

Nastya Medveda
Хорошо, но почему тогда в случае статического масс...

При этом вы можете сделать статический массив, привести его к указателю и потерять эту возможность

Nastya-Medveda Автор вопроса
Max Kolesnikov
В первом случае вы работаете с объектом типа масси...

Хорошо, то есть получается что статический массив и массив в куче — это разные объекты?

Anatoly Shirokov
Мы проводим статопрос перед умерщвлением плоти. Кт...

Вопрос не ко мне, но я тоже, пожалуй, отвечу. Собственные наблюдения, в том числе с использованием отладчика, и изучение дизассеблерного кода. Вы же, попав молотком по пальцам, тоже делаете вывод, что это больно? При этом совсем не требуется, чтобы вам об этом рассказал кто-то ещё.

Nastya Medveda
Хорошо, то есть получается что статический массив ...

Попробуйте представить себе, что такое "улица Пушкина" и чем она отличается от "улица Пушкина, дом 0" как адрес

Nastya Medveda
Хорошо, то есть получается что статический массив ...

У них разный storage duration, об этом уже сказали. В случае динамического выделения у вас просто нет выбора кроме как обращаться к массиву по указателю

Nastya Medveda
Хорошо, то есть получается что статический массив ...

"улица Пушкина, дом 0"[5] это дом "улица Пушкина, дом 5" "улица Пушкина"[5] это дом "улица Пушкина, дом 5" это не значит, что адрес дома 0 по улице Пушкина и улица Пушкина одно и то же

Constantine Drozdov
"улица Пушкина, дом 0"[5] это дом "улица Пушкина, ...

улица Пушкина это вообще два адреса дома, первого и последнего

Anatoly Shirokov
Чуви, ты наркоман

А с ним согласен. Массивы выглядят как указатели внутри функций. Аллоцированные на стеке через alloca

Liber Azerate
А с ним согласен. Массивы выглядят как указатели в...

Они не выглядят, они низводятся до указателей

Anatoly Shirokov
Они не выглядят, они низводятся до указателей

Нет, ну вот в LLVM IR, к примеру, массивы не являются SSA-value, они являются указателями

Anatoly Shirokov
Они не выглядят, они низводятся до указателей

низводятся это стандартный перевод для decay?

Constantine Drozdov
низводятся это стандартный перевод для decay?

Кажется стандартный это "деградируют"

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта