|
|
|
|
|
|
|
Вернуться
| 1 Егоров Илья Валерьевич, 30 июня 2019 г. 22:20:18 | |
...заций выдаст потрясающий результат: выхлоп на ассемблере будет такой же, как если бы мы использовали разные функции для разных типов. Это лишь сводка некоторых особенностей, но похожим образом можно обосновать и многие другие.
|
|
|
| 2 Егоров Илья Валерьевич, 30 июня 2019 г. 22:20:03 | |
Поясню почему вытекает целый ряд особенностей лишь из того, что были введены классы: - Ссылки: в Си мы практически не передаем сложные структуры в качестве аргументов функций, указатели как норма, а копирование элементарных значений вроде целочисленных для производительности не критичны. В C++ мы, однако, имеем классы и структуры, которые при простой передаче по значению копируются, что связано с накладными расходами. Так как указатели опасны, были введены ссылки — более безопасный и удобный способ передачи объектов в функции. - new и delete: malloc/calloc и free банально не умеют вызывать конструкторы и деструкторы, которые вызывать необходимо, желательно неявно. - Исключения: если есть классы и объекты, то вполне естественно будет иметь возможность более удобного способа выявления ошибок, нежели стандартным путем "сетнуть какой-то флаг". - Шаблоны: мы можем захотеть написать класс, умеющий работать с разными типами данных. В Си классов просто нет, а вычисления во время компиляции мы обеспечиваем себе при помощи макросов. Шаблоны вместо головоломных макросов — явление вполне ожидаемое, равно как и дальнейшие усовершенствования вроде constexpr. - typedef: признав макросы главной болью чистого Си, имея средства в обход макросов, мы и определять свои типы безопасным образом вместо "#define bool uint_fast8_t" захотим. - traits: вот есть у нас шаблоны. Чего еще надо? Конечно же, конкретику дать. Например, пусть у нас есть общая функция считывания данных из файла, которая может считывать разные целочисленные типы. Имеем 2 лагеря: типы знаковые и беззнаковые. Пусть мы знаем способ более быстрого считывания беззнаковых типов (нам же не нужно '-' выискивать). В стандартном Си у нас есть scanf, которому мы указываем что конкретно нужно считывать, но нам такой путь очевидно не подходит, ведь мы хотим автоматически выбирать нужный способ считывания. И тут на помощь приходит type_traits: мы можем путем обычных ветвлений задать для конкретного свойства типа конкретный метод считывания, а компилятор при этом после оптими
|
|
|
| 3 Егоров Илья Валерьевич, 30 июня 2019 г. 21:34:45 | |
|
Достаточно вспомнить, что изначально C++ был всего лишь "Си с классами". Из этого лаконично вытекает целый ряд особенностей плюсов: traits, исключения, даже new и delete отчасти. Для большего понимания разницы можно еще и по списку хидеров стандартной библиотеки пробежаться. В целом C++ "содержит" C, ибо является его расширением, разве что некоторые мелочи из чистого C вроде определенных особенностей макросов не поддерживаются.
|
|
|
Чтобы оставить сообщение необходимо зарегистрироваться и авторизоваться!
| | | |