LinuxForum.Fans
Тема

Различия в языках программирования C и C++

Автор: u__________10 42 сообщений 6419 просмотров
#168917
сантехник написал:
в с++ код утилизируется при помощи классов, если длинна кода в обоих случаях (с и с++) одинакова, как заявил док, то как он утилизируется в с?

обычно длинна кода в С++ несколько больше. КАЖУЩАЯСЯ простота кода С++ объясняется просто: мы например можем использовать чужие классы, причём делать это очень элегантно. К примеру, у нас есть массив в С, мы хотим его отсортировать. Если в С для этого применить qsort (из стандартной либы), получится:

text
       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>

static int cmpstringp(const void *p1, const void *p2) { /* The actual arguments to this function are "pointers to pointers to char", but strcmp(3) arguments are "pointers to char", hence the following cast plus dereference */

return strcmp(* (char * const *) p1, * (char * const *) p2); }

int main(int argc, char *argv[]) { int j;

if (argc < 2) { fprintf(stderr, "Usage: %s <string>...\n", argv[0]); exit(EXIT_FAILURE); }

qsort(&argv[1], argc - 1, sizeof(char *), cmpstringp);

for (j = 1; j < argc; j++) puts(argv[j]); exit(EXIT_SUCCESS); }

Совсем другой коленкор, если мы имеем абстрактный базовый класс collection. Нам надо сделать следующее:
1) унаследовать свой класс element от класса collection_element
2) перезагрузить функцию collection_element::compare() своей element::compare()
3) и всё. теперь мы смело можем писать my_collection.qsort();

Вот только, qsort от этого не стала не проще, и не быстрее. (медленнее тоже не стала, ибо оптимизирующий компилятор выкинет весь лишний синтаксический мусор. И указатель на функцию так и останется, правда спрятанный в VTable экземпляра класса.).

сантехник написал:
он жеж структурный.. нет классов.. за счет чего длинна кода равная?

процессор всё равно не структурный, а функциональный. В процессоре нету никаких классов. Потому, из C++ получается что-то вроде C, а уж него - ассемблер.

В моём примере, на самом деле, компилятор превращает гламурное my_collection.qsort(); в готичное
qsort(&argv[1], argc - 1, sizeof(char *), cmpstringp);
при этом, сам подставляет все эти ужасные типы, и сам заботится о деталях (в частности, куда указывает cmpstringp в данный момент времени. Это плюшка на самом деле приколочена к любому классу с виртуальными функциями. Только кодер её не видит. Но она есть. Дизассемблер вам поможет её увидеть.).

#168919
Fat-Zer написал:
на практике для простых типов машинный код получается одинаковый с точностью до порядка некоторых команд и некоторых странных действий... на самом деле в стандарте я нашёл только косвенные намёки на то, что для простых типов вызываются "операторы"... так что голову этим можно себе не забивать.

угу. вот только не следует думать, что если ваш класс отлично работает с типом int, то вы можете отдать его другим программистам, и он будет хоть как-то работать с их типами. Сила С++ в том и заключается, что можно один раз написать класс который сортирует, а потом им сортировать что угодно. Если "не забивать голову", то ваш класс никому будет не нужен. В том числе и вам. Ибо отсортировать ваши инты проще без создания отдельного класса только для этого.

Войдите или зарегистрируйтесь, чтобы ответить.