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

Всем привет, я тут читал, когда передавать указатель, а когда

копию и здесь есть вот такая фраза:
"Second is the consideration of efficiency. If the receiver is large, a big struct for instance, it will be much cheaper to use a pointer receiver."
Собственно, а как понять, когда структура достаточно большая, что ее не стоит передавать по значению?

13 ответов

10 просмотров

Почитай про размер стек фрейма, посчитай размер структуры своей -> вопрос отпадёт. А вообще, насколько я помню, никто тебе не гарантирует что компилятор не решит передавать копию или, наоборот, указатель там, где он посчитает, что это оправдано, входе всяких оптимизаций

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

Ilya-Starchenko Автор вопроса
lrrr_lrrr
Ну и вопрос в том должна ли функция мутировать пер...

Но если компилятор решит передать по указателю, то не будет гарантии иммутабельности.

Ilya Starchenko
Но если компилятор решит передать по указателю, то...

Если компилятор решил что-то сделать, то он решит это сделать в таком и только в таком случае, чтобы не внести неочевидного поведения

первый признак - структура имеет функции (хотя так говорить неправильно) в структуре больше 15 полей это второй признак

Ilya Starchenko
Но если компилятор решит передать по указателю, то...

Компилятор не может "решить" передать по указателю. Он в любом случае копирует данные на стек (или теперь в регистры).

Евгений Омельченко
15 булов это так-то 16 байт

Можно упаковать в 2 байта наверное

Ilya-Starchenko Автор вопроса
Александр Попов
первый признак - структура имеет функции (хотя так...

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

Практически всегда передавай структуры по указателю. Если нужно будет - потом оптимизируешь

где то и на эту тему есть статья. я обычно ориентируюсь так: если размер структуры больше чем размер указателя раза в полтора, то тогда использую как указатель

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта