The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Выпуск языка программирования Rust 1.54, opennews (??), 29-Июл-21, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


382. "Выпуск языка программирования Rust 1.54"  +/
Сообщение от Хан (?), 30-Июл-21, 17:47 
По значению нельзя, но это особенность реализации массива в Си, в той же структуре тот же Си обходится без указателей а просто пакует побайтово

Чтобы такие растоманы не гоняли память туда сюда без толку

Ответить | Правка | Наверх | Cообщить модератору

387. "Выпуск языка программирования Rust 1.54"  +/
Сообщение от Ф1 (?), 30-Июл-21, 17:58 
> По значению нельзя, но это особенность реализации массива в Си,

Я тебе про это и пишу.

> Чтобы такие растоманы не гоняли память туда сюда без толку

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

Ответить | Правка | Наверх | Cообщить модератору

392. "Выпуск языка программирования Rust 1.54"  –1 +/
Сообщение от Хан (?), 30-Июл-21, 18:08 
Хм посмотри на массив в структуре который запакован и передается по значению, такая реализация массива через указатель была выбрана во имя производительности ибо массив это самый гоняемый тудасюда тип данных в IPC, TCP/IP, i/o например
Ответить | Правка | Наверх | Cообщить модератору

526. "Выпуск языка программирования Rust 1.54"  +/
Сообщение от Ordu (ok), 31-Июл-21, 15:31 
> Чтобы такие растоманы не гоняли память туда сюда без толку

Оно не гоняет память туда-сюда без толку.

Глянь:

mod tmp {
    pub fn make_array() -> [i64; 128] {
    [-1; 128]
    }
}
fn main() {
    println!("{:?}", tmp::make_array());
}


(make_array засунута в сабмодуль, чтоб rustc её не инлайнил)

Другие твои комменты подсказывают мне, что ты хочешь доказать, что это крайне неэффективно, ибо копировать памяти много надо, и если так, то ты глобально ошибаешься. Забудь всё, что тебе рассказывал препод информатики в школе в 90-х. Это всё ложь. Уже лет 15-20 как это стало ложью.

Если это скомпилировать код выше с --emit=asm, то можно видеть такую штуку:

;; это main, прошу обратить внимание, mangled нехило, но тем не менее main
_ZN3tmp4main17hef74ed440589210dE:
    .cfi_startproc
    subq    $1112, %rsp     ; выделяется память на стеке под возвращаемое значение
    .cfi_def_cfa_offset 1120
    leaq    88(%rsp), %rdi  ; указатель на неё пошёл в %rdi, неявный аргумент для tmp::make_array
    callq    _ZN3tmp3tmp10make_array17h69c0c6c82460a46fE ; вызов make_array
        ...

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

Ответить | Правка | К родителю #382 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру