Anonymous
@hexenhammer, ну ты понял к чему я?:)
Anonymous
ну, это не "мажорная" версия
Anonymous
т.е. так и должно быть
Anatoly
почему ни слова про С++17
Где ни слова? Статьями весь инет завален.
Anonymous
@hexenhammer, угу.
Andrii
Почему такой код #include <stdio.h> #include <stdlib.h> int main() { int *p = (int*)malloc(sizeof(int)); int *q = (int*)realloc(p,sizeof(int)); *p = 1; *q = 2; if(p == q) printf("%d %d\n", *p, *q); } выводит 1 2 ?
Anonymous
потому-что p и q это указатели на область памяти
Anonymous
и равны адрессу
Andrii
?
Oleg
Потому что realloc ничего не гарантирует про старую выделенную память. Он может поменять размер выделенного куска на месте (если там свободный кусок, или поиграв со страницами как-нибудь хитро), а может просто выделить новый кусок и скопировать данные (что и случилось), тогда старый указатель — на уже освобождённую память, вам повезло, что его там сохранилось старое значение.
Ignat
я думаю, его смущает, что при этом p == q
Anonymous
#include<stdio.h> #include<stdlib.h> int main() { auto * p = (int*)malloc(sizeof(int)); // 4 byte auto * q = (int*)realloc( p, sizeof(int) ); printf(" %p == %p \n", p, q); *p = 1; // p == q *q = 2; if(p == q) printf("%d %d\n", *p, *q); }
Andrii
Потому что UB и компилятор может сделать что угодно.
типа если бы я использовал не стандартный malloc/realloc и не вставил бы его реализацию в этот же файл(а значит компилятор ничего о нем бы не знал) то такого бы не было?
Anonymous
lock@lock:~/c$ gcc t.c t.c: В функции «main»: t.c:6:9: предупреждение: в декларации «p» по умолчанию установлен тип «int» [-Wimplicit-int] auto * p = (int*)malloc(sizeof(int)); // 4 byte ^ t.c:7:9: предупреждение: в декларации «q» по умолчанию установлен тип «int» [-Wimplicit-int] auto * q = (int*)realloc( p, sizeof(int) ); lock@lock:~/c$ ./a.out 0x55ed23782010 == 0x55ed23782010 2 2
Anonymous
они ссылаются на один участок памяти
Anonymous
lock@lock:~/c$ clang t.c t.c:6:9: warning: type specifier missing, defaults to 'int' [-Wimplicit-int] auto * p = (int*)malloc(sizeof(int)); // 4 byte ~~~~ ^ t.c:7:9: warning: type specifier missing, defaults to 'int' [-Wimplicit-int] auto * q = (int*)realloc( p, sizeof(int) ); ~~~~ ^ 2 warnings generated. lock@lock:~/c$ ./a.out 0x602010 == 0x602010 2 2
Andrii
а зачем auto?
Anonymous
lock@lock:~/c$ clang -O t.c t.c:6:9: warning: type specifier missing, defaults to 'int' [-Wimplicit-int] auto * p = (int*)malloc(sizeof(int)); // 4 byte ~~~~ ^ t.c:7:9: warning: type specifier missing, defaults to 'int' [-Wimplicit-int] auto * q = (int*)realloc( p, sizeof(int) ); ~~~~ ^ 2 warnings generated. lock@lock:~/c$ ./a.out 0x602010 == 0x602010 1 2
Anonymous
дело во флаге
Anonymous
-O
Anonymous
Эй, т.е. мне здесь не место только потому что я не читал стандарт?(
Ignat
компилил clang-ом clang -O
а если ему ещё дать -fno-strict-aliasing?
Ignat
(не повторяйте в проде, трюк выполнен профессиональными простреливателями ног)
Artem
я не хотель обидеть, я просто переслал😭
Anonymous
@AndreySemchenko, ты понял, что ты можешь загуглить за флаг?
Anonymous
и посмотреть, что компилятор будет делать?
Ignat
ну смотри
Ignat
компилятор смотрит значит на твой код
Ignat
ты присваиваешь в p
Ignat
после того, как ему сделали realloc
Ignat
значит, ты откуда-то знаешь, что realloc сохранил его по тому же адресу
Ignat
потому что в противном случае ты разыменовываешь указатель, который разыменовывать нельзя
kitsu
компилятор смотрит значит на твой код
... и говорит "какого хрена ты пишешь эту дичь"
Ignat
ну компилятор и решает, что сравнение тогда можно и выкинуть
Anonymous
это есть -O
Anonymous
оптимизация
Ignat
почему он тогда разыменовал оба указателя — это, конечно, интересный вопрос
Ignat
ну мб он и не разыменовывал
Andrii
значит, ты откуда-то знаешь, что realloc сохранил его по тому же адресу
вопрос в том, что если б там вместо стандартного realloc-а было что-то другое, то компилятор бы не стал такого проделывать?
Ignat
а увидел, что в один ты записал 1
Ignat
а в другой — 2
Anonymous
lock@lock:~/c$ gcc -O3 t.c t.c: В функции «main»: t.c:6:9: предупреждение: в декларации «p» по умолчанию установлен тип «int» [-Wimplicit-int] auto * p = (int*)malloc(sizeof(int)); // 4 byte ^ t.c:7:9: предупреждение: в декларации «q» по умолчанию установлен тип «int» [-Wimplicit-int] auto * q = (int*)realloc( p, sizeof(int) ); ^ lock@lock:~/c$ ./a.out 0x55e972314010 == 0x55e972314010 2 2
Ignat
давайте каждый из 2143 участников этого итт треда скомпилит у себя и скопипастит вывод?
Anonymous
Это чисто прикол clang
Anonymous
его оптимизации
Anonymous
@loskutov, я лишь хотел показать, что дело в компиляторе.
Ignat
странное какое-то понятие
Ignat
дело очевидно в коде
Anonymous
То есть GCC так-же будет делать?
Ignat
ну имеет право
Anonymous
У меня не сделал.
Anonymous
Я сделал что-то плохое?
Ignat
ну не сделал и не сделал
Ignat
мог сделать литералли что угодно — выбрал что-то одно
Anonymous
Я понял к чему, но я не хотел сделать чего-то плохого, я лишь хотел показать
Anonymous
Не абстрактно, а на примере
Anonymous
В следующий раз буду оккуратнее, раз тут так не положенно.
Alexander "SonnySlave"
https://habrahabr.ru/post/347688/
Alexander "SonnySlave"
шах и мат, жалкие крестовики - Си эффективнее
Alexander "SonnySlave"
расходимся?
переименовываемся в pro.c
Alexander "SonnySlave"
потому что от C++ смысла не осталось
Anonymous
А ассемблер ещё эффективнее для таких штук
Anatoly
надо все же сообщить автору, что в стандартной библиотеке С++ есть priority_queue
Vsevolod
ну, это там не поможет
Alexander "SonnySlave"
Vsevolod
вот кстати, один момент в ++ мне реально сильно не нравится: нет никаких разумных соглашений манглинга символов, поэтому вот так взять и позвать c++ через ffi в общем случае нельзя (кроме как через extern "C")
Anatoly
там написано про это, почему он не брал её
чего-то не увидел, правда, бегло пробежался
Alexander "SonnySlave"
чего-то не увидел, правда, бегло пробежался
заимплементил заново, чтобы была реализация такая же как и на Си
🦥Alex Fails
т.е. сравнил свой плюсовелосипед с сишной реализацией
Matwey
Во, кстати про криптографию. https://lists.zx2c4.com/pipermail/wireguard/2018-January/002304.html
Anonymous
https://github.com/PurpleI2P/i2pd/search?utf8=%E2%9C%93&q=asm&type= https://github.com/openssl/openssl/search?utf8=%E2%9C%93&q=_asm&type=
Vsevolod
в openssl полно кода на асме
Vsevolod
только там это перлом называется