Anonymous
@hexenhammer, ну ты понял к чему я?:)
Anonymous
ну, это не "мажорная" версия
Anonymous
т.е. так и должно быть
Anonymous
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
?
Alexander "SonnySlave"
Anonymous
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);
}
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
Andrii
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
(не повторяйте в проде, трюк выполнен профессиональными простреливателями ног)
Artem
я не хотель обидеть, я просто переслал😭
Anonymous
@AndreySemchenko, ты понял, что ты можешь загуглить за флаг?
Andrii
Anonymous
и посмотреть, что компилятор будет делать?
Ignat
ну смотри
Ignat
компилятор смотрит значит на твой код
Ignat
ты присваиваешь в p
Ignat
после того, как ему сделали realloc
Ignat
значит, ты откуда-то знаешь, что realloc сохранил его по тому же адресу
Ignat
потому что в противном случае ты разыменовываешь указатель, который разыменовывать нельзя
Ignat
ну компилятор и решает, что сравнение тогда можно и выкинуть
Anonymous
это есть -O
Anonymous
оптимизация
Ignat
почему он тогда разыменовал оба указателя — это, конечно, интересный вопрос
Ignat
ну мб он и не разыменовывал
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
его оптимизации
Ignat
Anonymous
@loskutov, я лишь хотел показать, что дело в компиляторе.
Ignat
странное какое-то понятие
Ignat
дело очевидно в коде
Anonymous
То есть GCC так-же будет делать?
Ignat
ну имеет право
Anonymous
У меня не сделал.
Anonymous
Я сделал что-то плохое?
Ignat
ну не сделал и не сделал
Ignat
мог сделать литералли что угодно — выбрал что-то одно
Anonymous
Я понял к чему, но я не хотел сделать чего-то плохого, я лишь хотел показать
Anonymous
Не абстрактно, а на примере
Anonymous
В следующий раз буду оккуратнее, раз тут так не положенно.
Alexander "SonnySlave"
https://habrahabr.ru/post/347688/
Alexander "SonnySlave"
шах и мат, жалкие крестовики - Си эффективнее
Anatoly
Alexander "SonnySlave"
расходимся?
переименовываемся в pro.c
Alexander "SonnySlave"
потому что от C++ смысла не осталось
Anonymous
А ассемблер ещё эффективнее для таких штук
Anatoly
надо все же сообщить автору, что в стандартной библиотеке С++ есть priority_queue
Vsevolod
ну, это там не поможет
Alexander "SonnySlave"
Vsevolod
вот кстати, один момент в ++ мне реально сильно не нравится: нет никаких разумных соглашений манглинга символов, поэтому вот так взять и позвать c++ через ffi в общем случае нельзя (кроме как через extern "C")
🦥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
только там это перлом называется