Этому магистерскому курсу логически предшествует базовый, бакалаврский. Может быть вы хотите начать с него: ua-cam.com/play/PL3BR09unfgciJ1_K_E914nohpiOiHnpsK.html
Просто проходил мимо, в итоге посмотрел всю лекцию, очень интересно, спасибо! Я бы добавил к информации о важное замечание, что строка, на которою она указывает, не заканчивается '\0' (валидным считается диапазон [data(); data() + size()) ), поэтому не стоит использовать её метод () так же как () у , передавая её в функции, который ожидают строки, оканчивающиеся на '\0'.Так же при объявлении параметров функций рекомендуют передавать без const &, просто как .
Константин, пара микро-опечаток на слайдах 7 и 8. В коде используются строки "Hello, world" без восклицательного знака в конце, а на иллюстрациях в конце строк восклицательный знак есть.
Конечно вы правы, нужно выравнивать по sizeof(CharT), а не по 32 и потом ещё делить общее место на этот размер чтобы получить кол-во элементов в массиве и т.д. Итоговое вычисление будет страшноватым, можете заглянуть в реализацию в libc++. Но я немного сэкономил место в строчке на слайде, чтобы был ясен общий принцип.
Я довольно надолго залип на этом слайде потому что нутром чувствую, что литр, а доказать не могу. Прежде всего непонятно, зачем здесь sizeof(data) + один sizeof(size_t), т.к.указатель на данные и размер уже есть и в обычной, и в sso-шной строке, т.е. вне юниона. Потом только в комментариях нашел, что это неполный код.
Вопрос к Константину: этот плейлист (C++ Lectures at MIPT (in Russian)) стоит скачивать, если я уже скачал плейлист "C++ базовый курс, MIPT, 2021-2022" (магистерский курс тоже скачал)?
Я все еще не согласен, что const char* можно присвоить к char*, мы тогда потеряем константность данных, это не то же, что const int присвоить int-у, последнему эквивалентно [char*] = [char* const].
В примере с " trim me " опечатка, удаляется слишком много в конце, и получается "trim m". Должно быть: vtrim.remove_suffix(vtrim.size() - min(trimlst, vtrim.size()) - 1);
А что если константные строки сделать ref-counting, а мутабельные - как std::string? В мутабельных строках заодно можно увеличить буфер для small string optimization на размер счетчика ссылок. Наверняка такое уже где-то реализовано.
В идеологии C++ объект во время конструирования и большинства операций над ним не должен знать создают его мутабельным или нет. Ваше предложение можно доработать до shared_ptr который почти точно соответствует иммутабельному COW-объекту T, но там вылезут свои побочки.
Константин, здравствуйте ! -*- -*- -*- вопрос -*- -*- -*- Корректно ли работать дальше с представлением строки (std::string_view) если const char * был возвращён из функции например? Ведь будет совершенно корректно записать std::string_view str{"const_char_*"}; -*- -*- -*- код -*- -*- -*- const char *getStr() { return "const_char_*"; } int main(int, char **) { std::string_view str{getStr()}; std::cout
Этот вопрос интересней чем кажется, так как на самом деле вы спрашиваете какое строковые литералы имеют время жизни. Короткий ответ: достаточное (а конкретно static storage duration). У вас всё будет работать, конкретный пункт стандарта можете найти самостоятельно =)
Интересно было бы узнать: 1. По какому алгоритму вычисляется ёмкость строки, если заранее известен её размер (с сервака, скажем, прилетел, перед тем как прилетела сама строка)? Т.е. как сперва вычислить какой будет capacity, а потом решать, помещать String в мою маленькую, почти переполненную кучу, или лучше пока воздержаться\воспользоваться Си-строкой\сказать серваку, чтоб прислал только кусочек и т.д. 2. Сколько по умолчанию отъедает новый capacity, если предыдущий превышен? Под строку в куче выделяется новая память с переносом всей строки или может она там как-то фрагментируется, в виде двусвязного списка или xз как еще? А за лекцию автору спасибо. Для начинающих в C++ самое оно.
Почитайте про амортизированную сложность и про то как должен расти capacity чтобы вставка элемента в конец была O(1+). Если коротко: то нужно всегда удваивать. Лекция как и весь курс ни разу не для начинающих. Для начинающих начну выкладку со след. недели.
Я пока что выложил только магистерский курс. Предшествующий ему бакалаврский курс я конечно в своё время тоже запишу и выложу на этот канал, но вообще базовых курсов C++ в интернете много...
9:26 - этот код не скомпилируется в ISO С++, так как возвращаемый тип malloc - void*, то его надо явно скастить к типу char*. В Си не надо. godbolt.org/z/c2eQDf
Спасибо за лекцию. Только что столкнулся с SSO строками и невозможностью их перемещения без изменения указателя. Если бы не прослушал вашу лекцию пару месяцев так бы и не понял в чём причина.
Не понял как static const string_view решает проблему heap indirection, которая возникает при static const string. string_view же тоже необходимо где-то хранить буфер, а значит она должна вызвать malloc, разве нет?
"Они" это кто? Я в этой лекции явно иронизирую над изобретением велосипедов такого рода. Тем не менее, один раз в жизни во время обучения написать свою строку и наступить на все грабли это очень полезно
В группе в основном будущие инженеры Интел. И те, которые будут заниматься программированием и те, которые будут делать железо и те которые будут заниматься перф анализом, тестированием и прочим. Мне кажется, C++ всем полезно
@@tilir Так ведь с++ изучают с первого курса, программисты, к 5 курсу (1 курс магистратуры) должны быть уже полными профессионалами и по определению знать класс string. Такое впечатление что в вузах все 5 лет изучают как создать класс стринг и как сортировать массивы :)
@@LordAlanttt про сортировку массивов это вы в точку попали. Поищите доклад Андрея Александреску на CppCon'19. Увы мой курс далёк от такого сверхчеловеческого совершенства чтобы включить в него такого рода лекцию про сортировку. А так я бы включил, да
Невероятно талантливая и мастерская подача. Очень интересно смотреть и "учавствовать".
Спасибо за лекцию
Невероятно крутые лекции, спасибо вам!
Посмотрел на одном дыхании, спасибо за лекцию!
Этому магистерскому курсу логически предшествует базовый, бакалаврский. Может быть вы хотите начать с него: ua-cam.com/play/PL3BR09unfgciJ1_K_E914nohpiOiHnpsK.html
Один магистрант == одна проблема. (8:23)
Все таки лекторы умеют тонко пошутить над слушателями.
А так спасибо за материал.
Необыкновенно интересная лекция! Спасибо большое!
Просто проходил мимо, в итоге посмотрел всю лекцию, очень интересно, спасибо!
Я бы добавил к информации о важное замечание, что строка, на которою она указывает, не заканчивается '\0' (валидным считается диапазон [data(); data() + size()) ), поэтому не стоит использовать её метод () так же как () у , передавая её в функции, который ожидают строки, оканчивающиеся на '\0'.Так же при объявлении параметров функций рекомендуют передавать без const &, просто как .
Спасибо за лекцию, очень интересно!
Спасибо, весьма познавательно и полезно!
Константин, пара микро-опечаток на слайдах 7 и 8.
В коде используются строки "Hello, world" без восклицательного знака в конце, а на иллюстрациях в конце строк восклицательный знак есть.
Очень интересно, спасибо!
1:12:40 - "SZ = (sizeof(data) + 2*sizeof(size_t) + 31) / 32;"
По идее же должно как-то зависеть и от sizeof(CharT) ?
Конечно вы правы, нужно выравнивать по sizeof(CharT), а не по 32 и потом ещё делить общее место на этот размер чтобы получить кол-во элементов в массиве и т.д. Итоговое вычисление будет страшноватым, можете заглянуть в реализацию в libc++.
Но я немного сэкономил место в строчке на слайде, чтобы был ясен общий принцип.
Я довольно надолго залип на этом слайде потому что нутром чувствую, что литр, а доказать не могу. Прежде всего непонятно, зачем здесь sizeof(data) + один sizeof(size_t), т.к.указатель на данные и размер уже есть и в обычной, и в sso-шной строке, т.е. вне юниона. Потом только в комментариях нашел, что это неполный код.
Вопрос к Константину: этот плейлист (C++ Lectures at MIPT (in Russian)) стоит скачивать, если я уже скачал плейлист "C++ базовый курс, MIPT, 2021-2022" (магистерский курс тоже скачал)?
Нет это легаси. Новый магистерский его суперсетит.
Я все еще не согласен, что const char* можно присвоить к char*, мы тогда потеряем константность данных, это не то же, что const int присвоить int-у, последнему эквивалентно [char*] = [char* const].
Это уже есть в errata, см. описание видео. Найди что нибудь ещё.
В примере с " trim me " опечатка, удаляется слишком много в конце, и получается "trim m". Должно быть:
vtrim.remove_suffix(vtrim.size() - min(trimlst, vtrim.size()) - 1);
Согласен. Годболт тоже за: godbolt.org/z/sMv948
Забавно что это нашлось больше чем через год =) Добавил в errata
А что если константные строки сделать ref-counting, а мутабельные - как std::string? В мутабельных строках заодно можно увеличить буфер для small string optimization на размер счетчика ссылок. Наверняка такое уже где-то реализовано.
В идеологии C++ объект во время конструирования и большинства операций над ним не должен знать создают его мутабельным или нет.
Ваше предложение можно доработать до shared_ptr который почти точно соответствует иммутабельному COW-объекту T, но там вылезут свои побочки.
Константин, здравствуйте !
-*- -*- -*- вопрос -*- -*- -*-
Корректно ли работать дальше с представлением строки (std::string_view) если const char * был возвращён из функции например?
Ведь будет совершенно корректно записать std::string_view str{"const_char_*"};
-*- -*- -*- код -*- -*- -*-
const char *getStr() {
return "const_char_*";
}
int main(int, char **) {
std::string_view str{getStr()};
std::cout
Этот вопрос интересней чем кажется, так как на самом деле вы спрашиваете какое строковые литералы имеют время жизни. Короткий ответ: достаточное (а конкретно static storage duration). У вас всё будет работать, конкретный пункт стандарта можете найти самостоятельно =)
@@tilir наверное поэтому строковый литералы это lvalue
Интересно было бы узнать:
1. По какому алгоритму вычисляется ёмкость строки, если заранее известен её размер (с сервака, скажем, прилетел, перед тем как прилетела сама строка)? Т.е. как сперва вычислить какой будет capacity, а потом решать, помещать String в мою маленькую, почти переполненную кучу, или лучше пока воздержаться\воспользоваться Си-строкой\сказать серваку, чтоб прислал только кусочек и т.д.
2. Сколько по умолчанию отъедает новый capacity, если предыдущий превышен? Под строку в куче выделяется новая память с переносом всей строки или может она там как-то фрагментируется, в виде двусвязного списка или xз как еще?
А за лекцию автору спасибо. Для начинающих в C++ самое оно.
Почитайте про амортизированную сложность и про то как должен расти capacity чтобы вставка элемента в конец была O(1+). Если коротко: то нужно всегда удваивать.
Лекция как и весь курс ни разу не для начинающих. Для начинающих начну выкладку со след. недели.
Спасибо, Константин! А как посмотреть предыдущие лекции?
Я пока что выложил только магистерский курс. Предшествующий ему бакалаврский курс я конечно в своё время тоже запишу и выложу на этот канал, но вообще базовых курсов C++ в интернете много...
@@tilir а случайно не планируете курсы по ассемблеру или ОС выложить?)
9:26 - этот код не скомпилируется в ISO С++, так как возвращаемый тип malloc - void*, то его надо явно скастить к типу char*. В Си не надо.
godbolt.org/z/c2eQDf
Он не скомпилируется не только поэтому ) Даже если считать, что на слайде сишный код, там всё равно масса кровоточащих проблем. Это не случайно.
Спасибо за лекцию.
Только что столкнулся с SSO строками и невозможностью их перемещения без изменения указателя. Если бы не прослушал вашу лекцию пару месяцев так бы и не понял в чём причина.
Не понял как static const string_view решает проблему heap indirection, которая возникает при static const string. string_view же тоже необходимо где-то хранить буфер, а значит она должна вызвать malloc, разве нет?
Нет, он хранит только пару указателей
Что не так было бы с using std::string. Написано на слайде что специально typedef, комментария нет
Я немного не осознал вопрос. Можно номер слайда или таймкод?
@@tilir ua-cam.com/video/bDWdRyt6fIY/v-deo.html
1:11:55 Тут осознательно использован typedef a не using.
@@ivandomnikov9477 а ну там же написано на слайде -- в методических целях. Использовать typedef слишком часто не следует. Но узнавать его в коде нужно
@@tilir Ах. А я обыскался что в нем магического чего нет в using. Думал может что-то с инстанцированием. Спасибо за ответ
А где субтитры? Titled in english, but there is no subtitles.
Я надеюсь кто-нибудь сделает =)
Зачем они пять лет учат студентов писать класс string?
"Они" это кто? Я в этой лекции явно иронизирую над изобретением велосипедов такого рода. Тем не менее, один раз в жизни во время обучения написать свою строку и наступить на все грабли это очень полезно
@@tilir Извините, написал комментарий до того как досмотрел до момета иронизации :) Как я понимаю это магистратура не для программистов?
В группе в основном будущие инженеры Интел. И те, которые будут заниматься программированием и те, которые будут делать железо и те которые будут заниматься перф анализом, тестированием и прочим. Мне кажется, C++ всем полезно
@@tilir Так ведь с++ изучают с первого курса, программисты, к 5 курсу (1 курс магистратуры) должны быть уже полными профессионалами и по определению знать класс string. Такое впечатление что в вузах все 5 лет изучают как создать класс стринг и как сортировать массивы :)
@@LordAlanttt про сортировку массивов это вы в точку попали. Поищите доклад Андрея Александреску на CppCon'19. Увы мой курс далёк от такого сверхчеловеческого совершенства чтобы включить в него такого рода лекцию про сортировку. А так я бы включил, да
спасибо за лекцию
Спасибо за лекцию