Войти
ФлеймФорумПрограммирование

Почему сишные функции не обмазали нормальными ассертами? (9 стр)

Страницы: 14 5 6 7 8 9
#120
14:16, 20 мар. 2019

gudleifr
Тебе пора на лбу выбить клеймо "он несёт дичь, не слушайте его".


#121
(Правка: 14:39) 14:26, 20 мар. 2019

nes
> Это как чистить зубы через задницу.
Это естественный способ управления поведением. И в данном случае он будет более осмысленным чем тупое впаивание ассерта во внутрь memcpy()  потому, что такой подход дает возможность захендлить memcpy() и в подключаемом коде тоже + и еще и получть колстек.

#122
14:32, 20 мар. 2019

beejah
1 frag / 2 deaths
Господа Моськи, перестаньте тяфкать в теме коллеги. Для этого есть специальная тема.

#123
14:39, 20 мар. 2019

gudleifr
Не льсти себе. Слоны не кукарекают.

#124
14:45, 20 мар. 2019

gudleifr
> Но лучше идите на Форум и надувайте щеки,
> сойдете за бывалого.
Ты, как я понимаю, уже дошёл до этой стадии.

#125
15:00, 20 мар. 2019

На самом деле благодаря Гудлифру до меня дошло, что в данном случае ассерты не то что не нужны,
но и в большинстве своем не являются УБ.

#126
15:17, 20 мар. 2019

1 frag / 2 deaths
>
> Тебе пора на лбу выбить клеймо "он несёт дичь, не слушайте его".

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

#127
(Правка: 18:11) 18:08, 20 мар. 2019

nes
> Вот например самая основа основ - memcpy.
> но тут явно будет перекрытие данных, неужели нельзя было добавить один сраный
> ассерт?
Тему не читал, но в данной ситуации специально для спасения русской демократии существует memmove.

Panzerschrek[CN]
> Ты, как я понимаю, уже дошёл до этой стадии.
Не новое явление. Антисоветчик и городской сумасшедший Дейкстра, например, давно явил нам пример, как можно дойти до жизни такой.

#128
(Правка: 8:23) 8:14, 21 мар. 2019

gudleifr

> Для дебилов повторяю: скорость достигается не оптимизацией memcpy
Ты что-то запутался. Там выше написано: «в том случае, когда нужна максимальная скорость, ни один программист не станет пользоваться стандартной библиотекой». То есть у нас нет memcpy. Но memcpy нужна, поэтому настоящий напишет ее сам? Или как вообще понимать этот бред?

> выкидыванием избыточных memcpy.
Так настоящий сам дебил, если где-то в коде у него избыточные memcpy. Но его анамнез - это не повод выкидывать стандартную библиотеку.

#129
8:34, 21 мар. 2019

Ghost2
А как вообще можно умудриться сделать лишнюю memcpy?

#130
8:48, 21 мар. 2019

Vlad2001_MFS
Он мог быть не лишним изначально, ну потом код переписали и стали лишним.

memcpy(foo,bar,4)
//использование foo
memcpy(foo,too,4)
потом "использование foo" - удалили, а memcpy не заметили и оставили
#131
9:09, 21 мар. 2019

FlyOfFly
А, ну ок. Про такой момент я не подумал.

#132
(Правка: 11:16) 11:06, 21 мар. 2019

Vlad2001_MFS
> А как вообще можно умудриться сделать лишнюю memcpy?
Да легко, вообще-то.

Если у нас есть некоторая самостоятельная функция, которая что-то делает и внутри тасует память - так если расковырять последовательность таких функций, от части внутренних копирований можно избавиться.

Например, есть у нас фильтр, который трансформирует последовательность (на месте), и работает в несколько проходов, причём проходы не inplace (им нужны исходные данные целиком).

+ Показать

Соответственно, вызов filter выливается в:
+ Показать

Хотя могло бы быть
+ Показать

Пример про radix sort - туда же.

Или вот пишешь ты библиотеку длинной арифметики. C'шный интерфейс у тебя, скорее всего, 3-адресный:

void mul(const number *left,const number *right,number *dst);
Если наивно переписать это на перегруженные операторы C++, получим, что
dst=left*right;
сначала создаёт промежуточное значение, а затем копирует его в dst.
В GMP есть специальная шаблонная лабуда, которая разруливает такое в 3-адресные инструкции (можешь почитать исходники, там забавно).

Да даже банальные std::string:

void concat(const string &a,const string &b,string &c)
{
    c=a+b;
}
может (особенно без move-semantics) вызывать копирование, даже если c.capacity()>a.size()+b.size(). Желающие могут попробовать разобраться, что именно делает библиотека GCC:
https://godbolt.org/z/m6bgPH

Страницы: 14 5 6 7 8 9
ФлеймФорумПрограммирование