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

Это с cpprefference паста. Получается, что по стандарту UB, но

многие реализации позволяют использовать std::less для сравнения указателей?

17 ответов

25 просмотров

Даже лучше. Как уже написал, для встроенных операторов в отношении указателей сравнения гарантируют только partial-order, однако имплементации обязаны поддерживать некоторый согласованный с таким порядком неуточняемый total-order, который используется для библиотечных компараторов. Нужно для надежной ассоциативности в ситуациях, где указатели являются ключами ordered-контейнеров.

Да и если без формальностей вдуматься в суть того, что предлагает сделать автор кода, сразу видно, что это какая-то ересь: взять два объекта в памяти и стереть память между ними. Во первых не понятно для чего? Можно же просто нужные переменные инитить нулями или чем надо, Во-вторых, где гарантия что нужные переменные в памяти расположатся именно так, а не иначе?

Стикер

Ilya Zviagin
Да и если без формальностей вдуматься в суть того,...

Почему ересь? Если это внешние символы линковщика все там правильно. вопрос что и как он их разместил, и выровнял. линковщик вам дает символ (не переменную) взяв адрес которого вы получите адрес расположения этого символа.

Stas Koynov
Почему ересь? Если это внешние символы линковщика ...

Писать между объектами это UB. То есть, ересь.

Ilya Zviagin
Писать между объектами это UB. То есть, ересь.

Это не обьекты это просто память, нет там обьектов. А то что в ++ сейчас все UB ну так чтож не программировать микроконтроллеры на нем? рано или поздно допилят, а если нет, то да после каждой генерацией идти и проверять асм, что он там придумал.

Stas Koynov
Это не обьекты это просто память, нет там обьектов...

Это означает, что вам нужен memset с О0, например, в отдельном файле. Или асм, как это сделано во многих embedded startup-файлах

Ilya Zviagin
Тоже нельзя. Тоже UB.

Норм компиляторы типа gcc это разрешают. вот взять 12.3 прекрасно можно занулить секцию bss: /* Uninitialized data section */ .bss : { . = ALIGN(4); __bss_start = .; *(.bss*) *(COMMON) . = ALIGN(4); __bss_end = .; } > RAM_D2 extern uint32_t __bss_start, __bss_end, inline void __init_bss(uint32_t *bss_start, uint32_t *bss_stop) { while(bss_start != bss_stop) *bss_start++ = 0; } __init_bss(&__bss_start, &__bss_end); //zero fill bss section(zero vars) __libc_init_array(); //call static constructors

Stas Koynov
Норм компиляторы типа gcc это разрешают. вот взять...

реализация компилятора и стандарт 2 разные вещи

Aniki Hi$ok@ 🌈 Z 🐀
реализация компилятора и стандарт 2 разные вещи

Важнее вопрос наличия (или отсутствия) гарантий, на которые можно было бы положиться - хоть стандартных, хоть имплементационных. Либо да, post-build верификаторами какими-то пользоваться на те участки, по которым гарантий не было (при условии, что их вообще можно локализовать).

Aniki Hi$ok@ 🌈 Z 🐀
реализация компилятора и стандарт 2 разные вещи

Я еще раз повторю, взрослые компиляторы на которых пишут ОСи и т.п это жрет, а то что это УБ ибо там нет обьектов, и ой эта сырая память, и бла бла бла... я не хочу эту тему поднимать и холиварить. вопрос был топикстартера не про это. У него не работает либо ошибка в выравнивании или еще чего вылезло.

Пишите ld файл правильно, а не как хочет левая нога.

Stas Koynov
Пишите ld файл правильно, а не как хочет левая ног...

Ага, ну то есть мы уже выходим за рамки C++. Сам по себе напрашивается вопрос, почему бы не написать этот код на ассемблере

артем λ
Ага, ну то есть мы уже выходим за рамки C++. Сам п...

Зачем вам ++, пишите весь код на асме, ломает меня писать даже мемкопи на асме, от слов совсем

Stas Koynov
Зачем вам ++, пишите весь код на асме, ломает меня...

Вы сейчас передёргиваете. Язык предоставляет абстракции, и порой они не вписываются в устройство конкретного исполнителя. Такова уж цена

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

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

Вопрос по диагностике ошибок (я знаю в чем, в данном конкретном примере, я знаю, как исправить, пример модельный, понятно, что в реальности бывает намного запутаннее). module...
ⰄⰎⰋⰐⰐⰑⰛⰤⰧⰧⰩⰄ ⰊⰑⰁⰓⰡⰛⰦⰕⰫ
10
А дальше что?.. Записать в файл, потом в Код?.. И потом разбирать как-то?..
Хаскель Моисеевич Гопник
14
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
52
А чем вам питонисты не угодили?😂
.
79
доброго времени. db, dw и прочие исполняются при трансляции или при выполнении программы?
lutayyy
10
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
86
Есть предложения, как подобное можно упростить?
Hemul GM
12
@y0zhig @shizzard А можно я опишу цель и может вообще ерланг мне не подходит. На текущий момент как я понимаю у ерланга есть легковесные потоки и задача выполняется в каком т...
Дмитрий Спиридонов
5
У меня вопросик назрел. Почему, создав класс без наследования и реализации деструктора Destroy, деструктор не вызывался при free. Потом указал наследование от tobject и overri...
Сергей Бычков
9
Карта сайта