Re[3]: Превосходство Rust над C++ в одном примере
От: Нomunculus Россия  
Дата: 14.09.23 07:21
Оценка:
Здравствуйте, Shmj, Вы писали:

Ну раз ТЫ сказал, то видимо, да, нужно.
Re[9]: Превосходство Rust над C++ в одном примере
От: Teolog  
Дата: 14.09.23 07:48
Оценка:
TB>У двусвязного списка все плохо с кешем.
TB>Кстати а зачем он нужен? Я не моги припомнить таких случаев.

Вообще именно список — для быстрого удаления/добавления в середине.
Двухсвязный — для итерации в оба направления при поиске элемента.
На удивление, не столь бесполезны как кажется — на них lock-less контейнеры чудят.
Re: Превосходство Rust над C++ в одном примере
От: Skorodum Россия  
Дата: 14.09.23 07:54
Оценка:
Здравствуйте, Shmj, Вы писали:

S>
S>void fun1(std::unique_ptr<Class1> smart_ptr){}
S>

Вроде очевидно, что тип с префикосм "unique" не должен так использоваться
Re[8]: Превосходство Rust над C++ в одном примере
От: sergii.p  
Дата: 14.09.23 07:55
Оценка:
Здравствуйте, so5team, Вы писали:

S>Исключения могут летать в методах класса-контейнера при добавлении нового элемента.


тут надо говорить предметно. Лично я всегда перестрахуюсь. Потому как завтра придёт новый человек, подумает почему здесь так всё навёрнуто и совсем упустит момент, что это всё ради exception safety.

S>Заключение указателя в optional в C++ общем случае бессмысленно, т.к. этот указатель и есть optional.


ну вот не согласен. Можно сделать метод Person* find() или std::optional<Person*> find(). Во втором обратиться по нулевому указателю намного тяжелее, сложнее на лету вызвать метод find()->name() и т д. В общем, при использовании намного тяжелее не обработать ошибку.

SP>>как то что не поддерживает ссылки

S>Так ведь это вопрос, по которому консенсуса не смогли найти

что там за консенсус?

SP>>operator->() может приводить к UB

S>А вот это как раз понятно.

а вот мне не понятно. Если заботиться о скорости и забить на безопасность, то optional не нужен от слова совсем. Если важна именно безопасность использования, то хотя бы UB уберите из API.
В целом, складывается ощущение что в C++ optional просто не лезет по целой гамме причин. И зачем такого уродца родил коммитет, совсем не ясно. Лучше взять было стороннюю библиотеку, которая тебя полностью удовлетворяет. А сейчас даже сторонню тяжело взять. Любой на ревью спросит: "да зачем, в стандарте же есть".
Re[9]: Превосходство Rust над C++ в одном примере
От: so5team https://stiffstream.com
Дата: 14.09.23 08:14
Оценка: 2 (1)
Здравствуйте, sergii.p, Вы писали:

S>>Исключения могут летать в методах класса-контейнера при добавлении нового элемента.


SP>тут надо говорить предметно.


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

SP>Лично я всегда перестрахуюсь. Потому как завтра придёт новый человек, подумает почему здесь так всё навёрнуто и совсем упустит момент, что это всё ради exception safety.


Но ведь может прийти человек, который спросит, а зачем мы в C++ тратим ресурсы на то, что должно решаться другими способами? Как бы C++ никогда не был языком, дружественным для новичков. А после взлета Java, C# и Go ему и нет смысла таким оставаться. Это сейчас инструмент для решения задач, для которых пока(?) Java/C#/Scala/Kotlin/F#/Go и пр. не добрались. Поэтому разбрасываться тактами на ровном месте в C++ сейчас не очень понятная идея.

S>>Заключение указателя в optional в C++ общем случае бессмысленно, т.к. этот указатель и есть optional.


SP>ну вот не согласен. Можно сделать метод Person* find() или std::optional<Person*> find(). Во втором обратиться по нулевому указателю намного тяжелее, сложнее на лету вызвать метод find()->name() и т д. В общем, при использовании намного тяжелее не обработать ошибку.


Во втором случае точно так же можно без проблем вызвать find()->name() без предварительных проверок. Т.е. в обоих случаях правильный сценарий использования должен быть таким:
if(auto r = find(); r) {
  r->name();
}

И, что характерно, этот код одинаков и для голого указателя, и для optional.

SP>>>как то что не поддерживает ссылки

S>>Так ведь это вопрос, по которому консенсуса не смогли найти

SP>что там за консенсус?


Вроде бы вот здесь этот вопрос обсуждался: https://www.fluentcpp.com/2018/10/05/pros-cons-optional-references/

SP>>>operator->() может приводить к UB

S>>А вот это как раз понятно.

SP>а вот мне не понятно. Если заботиться о скорости и забить на безопасность, то optional не нужен от слова совсем. Если важна именно безопасность использования, то хотя бы UB уберите из API.


Так ведь optional дает оба подхода:

— небезопасный: operator bool, operator*, operator->
— безопасный: has_value, value.

Каким хотите, таким и пользуйтесь. Есть выбор.

В std::vector так же полно UB в API. Как-то живем.
Re[2]: Превосходство Rust над C++ в одном примере
От: so5team https://stiffstream.com
Дата: 14.09.23 08:31
Оценка: +4
Здравствуйте, Skorodum, Вы писали:

S>>
S>>void fun1(std::unique_ptr<Class1> smart_ptr){}
S>>

S>Вроде очевидно, что тип с префикосм "unique" не должен так использоваться

Да ладно вам. Накинулись на человека. Как раз здесь Шмыж, как ни странно, прав.
Не редко бывают случаи, когда кто-то создает объект, а затем передает ответственность за этот объект кому-то еще. Как раз с помощью std::unique_ptr. Что-то вроде:
void ensure_valid(const Transaction & trx);
void log_acceptance(const Transaction & trx);
void push_to_processing(std::unique_ptr<Transaction> trx);

...
while(!stop) {
  std::unique_ptr<Transaction> trx = acquire_new_trx();
  ensure_valid(*trx); // Не отдаем владение.
  log_acceptance(*trx); // Не отдаем владение.
  push_to_processing(std::move(trx)); // Отдали владение и забыли про объект.
}

Так что наличие std::unique_ptr<T> как аргумент по значению однозначно указывает на то, что вызываемая функция забирает и объект, и ответственность за его дальнейшую судьбу себе.
Re[3]: Превосходство Rust над C++ в одном примере
От: sergii.p  
Дата: 14.09.23 08:51
Оценка: +1
Здравствуйте, so5team, Вы писали:

S>Как раз здесь Шмыж, как ни странно, прав.


к сожалению он не так уж редко говорит правильные вещи, но из-за сложившейся репутации эти идеи сразу записывают в маргинальные
По-моему идиому, что конструктор принимает строку по значению, высказывал ещё Майерс, только появилась семантика перемещения. А ведь строка — это и есть по сути unique_ptr.
Re: Превосходство Rust над C++ в одном примере
От: ArtDenis Россия  
Дата: 14.09.23 09:44
Оценка:
Здравствуйте, Shmj, Вы писали:

S>...

S>Компилятор С++ это принимает и не пикнет — максимум варнинг выдаст, и то не всегда. А ведь это 100% ошибка без вариантов. А в Rust право владения — суть концепция самого языка.

C++ даёт возможность расстреливать ноги огромным количеством способов, а Rust — не даёт. Вот это новость!
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: Превосходство Rust над C++ в одном примере
От: Skorodum Россия  
Дата: 14.09.23 10:52
Оценка:
Здравствуйте, so5team, Вы писали:

S>void push_to_processing(std::unique_ptr<Transaction> trx);

S>Так что наличие std::unique_ptr<T> как аргумент по значению однозначно указывает на то, что вызываемая функция забирает и объект, и ответственность за его дальнейшую судьбу себе.
Core Guide говорит использовать такой подход, но есть ли тут гарантия совместимости если push_to_processing это функция из библиотеки которая собранна другой версией компилятора?

Нашел у себя такой код завязянный на Qt:
auto data = std::unique_ptr<QSurfaceDataArray>(new QSurfaceDataArray);
...
// series takes ownership
m_powerSeries->dataProxy()->resetArray(data.release());


Думаю, что resetArray принимает владение через голый указатель именно для гарантии бинарной соместимости.
Re[4]: Превосходство Rust над C++ в одном примере
От: so5team https://stiffstream.com
Дата: 14.09.23 11:31
Оценка:
Здравствуйте, Skorodum, Вы писали:

S>>void push_to_processing(std::unique_ptr<Transaction> trx);

S>>Так что наличие std::unique_ptr<T> как аргумент по значению однозначно указывает на то, что вызываемая функция забирает и объект, и ответственность за его дальнейшую судьбу себе.
S>Core Guide говорит использовать такой подход, но есть ли тут гарантия совместимости если push_to_processing это функция из библиотеки которая собранна другой версией компилятора?

Если заботиться о разных версиях компилятора и stdlib, то передача вообще чего-либо C++ного по значению, имхо, становится проблемой (да и не по значению тоже стрёмно). И в проектах, где на это заморачиваются, выставляют наружу обычный plain C интерфейс, afaik.
Re[2]: Превосходство Rust над C++ в одном примере
От: ononim  
Дата: 14.09.23 12:54
Оценка:
AD>C++ даёт возможность расстреливать ноги огромным количеством способов, а Rust — не даёт. Вот это новость!
да, но
Как много веселых ребят, и все делают велосипед...
Re: Превосходство Rust над C++ в одном примере
От: Baiker  
Дата: 14.09.23 15:38
Оценка:
Здравствуйте, Shmj, Вы писали:

S>И придумал для таких же как я простой и наглядный пример


Ты палатой ошибся. Здесь уже вылеченные от "прыжков по языкам" люди. А ты всё как Рогозин, пытаешься улететь в космос на батуте. К чему ты заводишь свои тухлые топики с Растом? У тебя что, чесотка? Успокойся, ПИШИ НА РАСТ, зачем ты людей дёргаешь? Или ты нутром всё же понимаешь, что ковыряешься в говне, но пытаешься выглядеть выше даже C#-щиков?
Re[2]: Превосходство Rust над C++ в одном примере
От: Shmj Ниоткуда  
Дата: 14.09.23 18:47
Оценка:
Здравствуйте, Baiker, Вы писали:

B>Ты палатой ошибся. Здесь уже вылеченные от "прыжков по языкам" люди. А ты всё как Рогозин, пытаешься улететь в космос на батуте. К чему ты заводишь свои тухлые топики с Растом? У тебя что, чесотка? Успокойся, ПИШИ НА РАСТ, зачем ты людей дёргаешь? Или ты нутром всё же понимаешь, что ковыряешься в говне, но пытаешься выглядеть выше даже C#-щиков?


Так как бы не очень хочется, но объективно вынужден признать что парадигмы более строгие.
Re[7]: Превосходство Rust над C++ в одном примере
От: CreatorCray  
Дата: 15.09.23 01:03
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>ну банально чтобы не получить утечку памяти. Ручное удаление может не так уж плохо в С, а в С++ летают исключения — RAII скорей не роскошь, а необходимость.

Ты правда хочешь кидать исключения из деструктора?
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re: Превосходство Rust над C++ в одном примере
От: Разраб  
Дата: 15.09.23 01:20
Оценка:
Здравствуйте, Shmj, Вы писали:

Не подскажите, как можно в си++ написать функцию которая считывает и возвращает строку, вызывается в майн и печатается на экране.
Дело в том что я написал ее на раст, а вот на зиг который требует для этого управлением памятью, падает в рантайм с ошибкой утечки памяти.
На раст это оказалось сделать несложно относительно зига, конечно.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Превосходство Rust над C++ в одном примере
От: Shmj Ниоткуда  
Дата: 15.09.23 04:06
Оценка:
Здравствуйте, Разраб, Вы писали:

Р>Не подскажите, как можно в си++ написать функцию которая считывает и возвращает строку, вызывается в майн и печатается на экране.

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

Откройте для себя GPT.

C++

#include <iostream>
#include <string>

// Функция для считывания строки с клавиатуры
std::string readStringFromInput() {
    std::string inputString;
    std::cout << "Введите строку: ";
    std::getline(std::cin, inputString);
    return inputString;
}

int main() {
    // Вызываем функцию для считывания строки
    std::string str = readStringFromInput();

    // Выводим считанную строку на экран
    std::cout << "Вы ввели строку: " << str << std::endl;

    return 0;
}


Rust:

use std::io;

// Функция для считывания строки с клавиатуры
fn read_string_from_input() -> String {
    let mut input_string = String::new();
    println!("Введите строку:");
    io::stdin().read_line(&mut input_string).expect("Ошибка при считывании строки");
    input_string
}

fn main() {
    // Вызываем функцию для считывания строки
    let str = read_string_from_input();

    // Выводим считанную строку на экран
    println!("Вы ввели строку: {}", str);
}


Zig:

const std = @import("std");

pub fn readStringFromInput(allocator: *std.mem.Allocator) ![]const u8 {
    var stdin = std.io.getStdIn();
    const bufferSize: usize = 1024;
    var buffer: [bufferSize]u8 = undefined;

    var builder = std.heap.Writer.init(allocator);
    while (try stdin.read(buffer[0..]) |chunk|) |chunk| {
        try builder.append(chunk);
    }

    return builder.toOwnedSlice();
}

pub fn main() void {
    const allocator = std.heap.page_allocator;
    defer allocator.deinit();

    const inputString = try readStringFromInput(allocator);

    const output = std.io.getStdOut();
    try output.print("Вы ввели строку: {}\\n", .{inputString});
}


Zig это —
Отредактировано 15.09.2023 4:09 Shmj . Предыдущая версия .
Re[3]: Превосходство Rust над C++ в одном примере
От: sergii.p  
Дата: 15.09.23 06:55
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Zig это —


что-то мне кажется, это не Zig, это GPT —

fn nextLine(reader: anytype, buffer: []u8) !?[]const u8 {
    var line = (try reader.readUntilDelimiterOrEof(
        buffer,
        '\n',
    )) orelse return null;
    // trim annoying windows-only carriage return character
    if (@import("builtin").os.tag == .windows) {
        return std.mem.trimRight(u8, line, "\r");
    } else {
        return line;
    }
}

test "read until next line" {
    const stdout = std.io.getStdOut();
    const stdin = std.io.getStdIn();

    try stdout.writeAll(
        \\ Enter your name:
    );

    var buffer: [100]u8 = undefined;
    const input = (try nextLine(stdin.reader(), &buffer)).?;
    try stdout.writer().print(
        "Your name is: \"{s}\"\n",
        .{input},
    );
}


хотя это говорит об уровне составления документации. Аллокаторы обсуждаются с самого начала, как-будто без них прожить нельзя.
Re[8]: Превосходство Rust над C++ в одном примере
От: sergii.p  
Дата: 15.09.23 07:06
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Ты правда хочешь кидать исключения из деструктора?


не вижу связи. По вашему получается, если человек использует умные указатели, то он хочет кидать исключения из деструктора? Я просто хотел сказать, что в С++ умные указатели более востребованы из-за непредсказуемой последовательности действий. В С мы можем быть точно уверены, что дойдём до конца функции и вызовем очистку памяти, а в С++ любое исключение вносит долю неопределённости.
Re[4]: Превосходство Rust над C++ в одном примере
От: __kot2  
Дата: 16.09.23 06:55
Оценка:
Здравствуйте, Khimik, Вы писали:
K>Ой, сорри. Я попросил GPT3 перевести код на Delphi, сильно понятнее не стало. Тут что-то с умными указателями? В строке void fun1(std::unique_ptr<Class1> smart_ptr){} на входе функции fun1 подаётся два параметра или один?
Тут основная шутка в том что это написал человек не понимающий ассемблера или же просто очень острый шутник. На самом деле std move ничего не перемещает. Объект остается на стеке или в регистрах и спокойно переиспользуетмя. Формально там ошибка (нуачо, объект же был перемещен) по факту нет
Re[2]: Превосходство Rust над C++ в одном примере
От: Константин Б. Россия  
Дата: 16.09.23 12:59
Оценка:
Здравствуйте, Baiker, Вы писали:


B>Ты палатой ошибся. Здесь уже вылеченные от "прыжков по языкам" люди. А ты всё как Рогозин, пытаешься улететь в космос на батуте. К чему ты заводишь свои тухлые топики с Растом? У тебя что, чесотка? Успокойся, ПИШИ НА РАСТ, зачем ты людей дёргаешь? Или ты нутром всё же понимаешь, что ковыряешься в говне, но пытаешься выглядеть выше даже C#-щиков?


У него то может и чесотка, а у тебя явно жжение )
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.