LINUX.ORG.RU

Rust vs C

 ,


3

7

Я Rust не знаю.
Допустим решил я написать быстрый лексер (разбиватель токенов),как я делаю это в Си:

typedef struct {
    const char* text;
    size_t      text_len;
    size_t      text_pos;

    const char* token;
    size_t      token_len;
} lexer_t;
 
void lexer_next_token(lexer_t* lexer);

И я могу получить все токены без выделения памяти,я просто иду по тексту и ставлю lexer_t.token в начало токена, и в token_t.token_len записываю длинну токена.А в расте как сделать подобную вещь?Тоже без выделения памяти естественно (ну кроме стека,где выделяется код возврата и 2 size_t для функии next_token).Верней можно ли сделать такое в расте?

Ответ на: комментарий от anonymous

Ты мне не дал -D, потому что в твоем листинге не хватает .data* и я могу это показать. Например смотрим на строчку 8c56. в регистр загружается указатель на vtable, которая лежит по адресу 24abc8. Где этот адрес в твоем листинге? в моем есть, а в твоем нету. Значит ты или не дал -D или пострипал .data поломав бинарь.

pftBest ★★★ ()
Ответ на: комментарий от pftBest

Ты мне не дал -D, потому что в твоем листинге не хватает .data* и я могу это показать.

Я делал -D.

Например смотрим на строчку 8c56. в регистр загружается указатель на vtable, которая лежит по адресу 24abc8. Где этот адрес в твоем листинге?

Дак покажи в своём. В чём проблема? Я тебе что в моём заставляю?

Значит ты или не дал -D или пострипал .data поломав бинарь.

Возможно. Хотя в вроде пересобирал после стрипа, а может и нет.

anonymous ()
Ответ на: комментарий от anonymous

Я уверен ты достаточно умен чтобы самому найти то что ты ищешь. drop_in_place это деструктор, а указатель на деструктор всегда идет первым в таблице. Смотришь на все vtable в секции .data.rel.ro и находишь тут у которой первые байты c0 31 01 (адрес твоей функции).

Ты хотел показать какой LTO плохой и не удалил неиспользуемую функцию, но на самом деле она используется, и LTO все правильно сделал.

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

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

Надо или печатать напрямую в обход буфера:

    writeln!(io::stdout(), "Hello, {} world", 3.14);

Или печатать в массив на стеке:

    let mut buf = [0u8; 512];
    let mut cur = Cursor::new(buf.as_mut());
    writeln!(&mut cur, "Hello, {} world", 3.14);

В обоих случаях аллокаций не будет.

pftBest ★★★ ()
Ответ на: комментарий от anonymous

С/С++ и раст - это языки абсолютно разных категорий. Раст из котегории «программист-аутист», а С++, как и си.

Нет, C и C++ совсем в разных категориях. У C++ жирный рантайм, есть куча вещей, которые делаются под капотом. Зато на C++ легко делаются вещи, которые в C выглядят нечитаемо и требуют кучу проверок. Поэтому на C++ нежелательно писать ядро ОС, а на C не очень удобно писать прикладной софт.

anonymous ()
Ответ на: комментарий от anonymous

очень удобно писать прикладной софт.

Ну не сказал бы, что прямо очень. Прикладной софт (на десктопе) сейчас в большинстве на Яве или C#, за исключением игр.

gene1 ()
Ответ на: комментарий от gene1

Какой-то программерский манямирок. На сишарпе одна программа из десяти, на жаве десктопный софт видел только на лоре самописный. Всё остальное цпп или даже паскали всякие.

anonymous ()