|
|
|
Железный канал: «C, С++» |
|
|
Diff 708 EGP
Рейтинг канала: 8(861) Репутация: 44 Сообщения: 4179 Откуда: Сферическая Земля в вакууме. Зарегистрирован: 04.07.2003 |
|
ТехноМаг : |
Вот давай без этого.
|
Я не просто так ругаюсь.
Лет уже довольно много назад я работал в конторе писавшей телекоммуникационный софт. Поскольку флеш-память была дорогая а решения обычно встраиваемыми, писали под QNX, еще старый. Но чудо-компилятор watcom 10.6 не знал STL. Поэтому мы написали библиотеку типов сами. Она была хорошая, эта библиотека. Потом память подешевела и мы решили с QNX валить на линукс. Портировали софт, библиотеки, драйвера. А вот библиотеку типов мы выбросили. Хотя там ничего портировать не надо было, она и так работала. Но ни одной причины сохранять эти наработки при имеющейся стандартной библиотеке мы не нашли. Хотя было жалко и были люди которые говорили это же наше родное, смотрите оно на 2% быстрее в написанном мной тесте.
Вот мне и хочется понять логику по которой надо по своей воле отказываться от стандартной библиотеки.
ТехноМаг : |
Сойдемся на том, что в STL есть свои минусы.
|
Давайте все же сперва их озвучим?
Я пока что увидел только аргумент про размер бинарника. Этот аргумент прокатывал 20 лет назад, а уже 15 лет назад на него смотрели косо. Ты серьезно хочешь его приводить? Тогда приведи цифры экономии.
Про лучшую эффективность тоже хочется конкретики. Мой опыт говорит об обратном.
ТехноМаг : |
Используешь STL повсеместно? Пожалуйста, никто тебе слова не скажет.
|
На самом деле все хуже. Последние несколько лет я занимаюсь качеством разрабатываемого софта. И когда я вижу подобные велосипеды на ровном месте - я иду и забиваю разработчику в голову гвоздь. Могу даже дрелью . Этого требует моя должностная инструкция. Поэтому я нервно реагирую на пропаганду велосипедостроения. Мне же гвоздей не хватит.
Хотя заставить этих гребаных сишников перестать использовать goto никак не могу. Говорят, не суйся со своими плюсовыми замашками в наш низкоуровневый монастырь .
БулерМэн : |
Да, кстати использую C99
|
Ну, осталось понять, зачем ты это делаешь.
_________________ Конец света в конце тоннеля |
|
|
Grebomet 1460 EGP
Рейтинг канала: 8(753) Репутация: 261 Сообщения: 4765 Откуда: Питербурх Зарегистрирован: 06.01.2003 |
|
Люто, бешно присоединяюсь к вопросу Диффа: Булермэн, зачем тебе именно си, да еще и 99-го стандарту?
Я к тому, что если у тебя есть суровая причина, то в теме резко поубавится срачей на тему "С99/С++ /STL/Qt/велосипед не нужен".
_________________ Классическая ошибка, которую совершают проектировщики абсолютно надежных систем, – недооценка изобретательности клинических идиотов. |
|
|
Minx 980 EGP
Рейтинг канала: 2(19) Репутация: 136 Сообщения: 10528 Откуда: Gomel, Belarus Зарегистрирован: 19.11.2005 |
|
ТехноМаг : |
STL
Код: |
/** Returns the number of elements in the %list. */
size_type
size() const
{ return std::distance(begin(), end()); }
|
Т.е. вместо сложности O(1) мы получаем O(N). Иногда это бывает критично.
|
Здесь сложность зависит от реализации. Продвинутые STL (а не узкие) уже имели O(1) давно. А со времен c++11 требование O(1) прописано на уровне стандарта.
_________________ μηδείς αγεωμέτρητος εισίτω
Последний раз редактировалось: Minx (19:03 01-10-2015), всего редактировалось 1 раз |
|
|
Grebomet 1460 EGP
Рейтинг канала: 8(753) Репутация: 261 Сообщения: 4765 Откуда: Питербурх Зарегистрирован: 06.01.2003 |
|
Minx : |
Продвинутые STL (а не узкие) уже имели O(1) давно.
|
Не знаю, что такое "узкие" STL, но в природе до сих пор полным-полно реализаций со сложностью O(n). Например, у нас до сих пор проект собирается GCC 4.8.5, в котором такая сложность.
С другой стороны, в компиляторе SunPRO сложность была O(1) еще в 1990-х годах.
Кстати о продвинутости. У продвинутых есть проблемка: медленно работающая функция splice(). Так что грабли - везде.
_________________ Классическая ошибка, которую совершают проектировщики абсолютно надежных систем, – недооценка изобретательности клинических идиотов. |
|
|
Diff 708 EGP
Рейтинг канала: 8(861) Репутация: 44 Сообщения: 4179 Откуда: Сферическая Земля в вакууме. Зарегистрирован: 04.07.2003 |
|
Я как-то давно решил устроить соревнование компиляторам. Написал какой-то дурацкий тест с циклом на дохреллион операций. Собрал интелом, gcc и сановским. Все на спарке. Запустил.
Интел и гцц выдали какие-то секунды выполнения, интел поменьше, гцц побольше. А сановский выдал ноль. Он весь мой говнотест посчитал еще при компиляции .
_________________ Конец света в конце тоннеля |
|
|
Grebomet 1460 EGP
Рейтинг канала: 8(753) Репутация: 261 Сообщения: 4765 Откуда: Питербурх Зарегистрирован: 06.01.2003 |
|
Кстати да, сановский цомпилятор в плане оптимизаций - молодец. А ежели при компиляции еще и быстрая реализация кой-каких библиотек включена (навскидку вспоминается "быстрый" memcpy) - так и вообще пипец.
Жаль, прикрыли проект.
_________________ Классическая ошибка, которую совершают проектировщики абсолютно надежных систем, – недооценка изобретательности клинических идиотов. |
|
|
DIMOSUS.X 997 EGP
Рейтинг канала: 4(58) Репутация: 188 Сообщения: 3252 Откуда: Vilnius/Minsk Зарегистрирован: 06.08.2008 |
|
Господа, объясните извращенному сишарпом, что это за звездочка в объявлениях?
Код: |
IplImage *image = cvQueryFrame( capture );
CvMat* intrinsic_matrix = cvCreateMat(3, 3, CV_32FC1);
|
Предположительно в первом случае создается объект и переменной присваивается его адрес.
_________________ Даже ежики ежиков могут с трудом,
Иначе бы ежики были кругом.
Последний раз редактировалось: DIMOSUS.X (02:05 31-12-2015), всего редактировалось 2 раз(а) |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
DIMOSUS.X : |
бъясните извращенному сишарпом, что это за звездочка в объявлениях?
|
Патрон для выстреливания в ногу.
DIMOSUS.X : |
Предположительно в первом случае создается объект и переменной присваивается его адрес.
|
И во втором тоже.
Создается экземпляр заданного типа в отдельно выделенном под него участке памяти; выделятся 4 байта на переменную (в другом месте) и туда кладется начальный адрес созданного экземпляра. Получается указатель.
Для наглядности:
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
Последний раз редактировалось: ТехноМаг (05:05 31-12-2015), всего редактировалось 4 раз(а) |
|
|
Minx 980 EGP
Рейтинг канала: 2(19) Репутация: 136 Сообщения: 10528 Откуда: Gomel, Belarus Зарегистрирован: 19.11.2005 |
|
DIMOSUS.X : |
Предположительно в первом случае создается объект и переменной присваивается его адрес.
|
Переменная image имеет тип "IplImage*", т.е. указатель на объект типа IplImage.
image занимает size_t байт (4 для 32бит и 8 для 64бит) и храниться на стеке.
Если C++, то объект, на который указывает image, был создан в heap'e оператором new (т.е. динамически). Ответственность за удаление этого объекта лежит на том, кто его получает, т.е. в данном случае на тебе. Т.е. если его никуда не передаешь под другую ответственность, то во избежание утечек его нужно удалить оператором delete
delete image;
C CvMat та же история, только там другой тип.
_________________ μηδείς αγεωμέτρητος εισίτω
Последний раз редактировалось: Minx (09:12 31-12-2015), всего редактировалось 2 раз(а) |
|
|
DIMOSUS.X 997 EGP
Рейтинг канала: 4(58) Репутация: 188 Сообщения: 3252 Откуда: Vilnius/Minsk Зарегистрирован: 06.08.2008 |
|
Спасибо.
Положение звездочки разное в этих случаях - несет ли это в себе некий сакральный смысл, или это два варианта записи одного и тогоже?
_________________ Даже ежики ежиков могут с трудом,
Иначе бы ежики были кругом. |
|
|
Minx 980 EGP
Рейтинг канала: 2(19) Репутация: 136 Сообщения: 10528 Откуда: Gomel, Belarus Зарегистрирован: 19.11.2005 |
|
С точки зрения смысла и кода одно и то же, звездочка может быть поставлена где угодно:
A * a;
A* a;
A *a;
_________________ μηδείς αγεωμέτρητος εισίτω |
|
|
DIMOSUS.X 997 EGP
Рейтинг канала: 4(58) Репутация: 188 Сообщения: 3252 Откуда: Vilnius/Minsk Зарегистрирован: 06.08.2008 |
|
А может тут еще и гуру мэйк файлов есть?
Есть такой мэйкфайл:
Cкрытый текст (кликните здесь для просмотра)
Код: |
CCFLAGS=-pipe -pthread -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -lwiringPi -lwiringPiDev -lpthread -lm -Wall -I../ -lrf24-bcm -lopencv_core -lopencv_imgproc -lopencv_highgui -l bcm2835
PROGRAM = robot
SOURCES = robot.cpp io.cpp motors.cpp radio.cpp bmp085.cpp I2Cdev.cpp MPU9150.cpp MadgwickAHRS.c Kalman.cpp PID.cpp camera.cpp
OBJS = ${SOURCES:%.cpp=%.o}
.SUFFIXES: .cpp .o
.cpp.o:
ccache g++ ${CCFLAGS} -c $< -o $@
$(PROGRAM): ${OBJS}
ccache g++ ${CCFLAGS} ${OBJS} -o $(PROGRAM)
clean:
rm -rf *.o $(PROGRAM)
|
|
Как мне научить компилятор сорить *.о файлами в отдельном каталоге?
_________________ Даже ежики ежиков могут с трудом,
Иначе бы ежики были кругом. |
|
|
AnrDaemon 860 EGP
Рейтинг канала: 8(787) Репутация: 37 Сообщения: 12301
Зарегистрирован: 17.10.2004 |
|
Выучить слово "сборка вне дерева исходников". (Out of tree building.)
_________________ Люблю свободный полёт... :) |
|
|
Diff 708 EGP
Рейтинг канала: 8(861) Репутация: 44 Сообщения: 4179 Откуда: Сферическая Земля в вакууме. Зарегистрирован: 04.07.2003 |
|
Димосус, а оно тебе точно надо? Там кроме назначения звёздочки человека избалованного шарпом ждёт ещё масса огорашивающих открытий.
_________________ Конец света в конце тоннеля
Последний раз редактировалось: Diff (12:46 02-01-2016), всего редактировалось 1 раз |
|
|
DIMOSUS.X 997 EGP
Рейтинг канала: 4(58) Репутация: 188 Сообщения: 3252 Откуда: Vilnius/Minsk Зарегистрирован: 06.08.2008 |
|
Шарп под линуксом это изврат. А вообще нормально, освоился. Главное память за собой чистить
_________________ Даже ежики ежиков могут с трудом,
Иначе бы ежики были кругом. |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
DIMOSUS.X : |
Шарп под линуксом это изврат.
|
Ровно такой-же, как и под виндой. Поэтому вопрос таки не снимается.
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей." |
|
|
Diff 708 EGP
Рейтинг канала: 8(861) Репутация: 44 Сообщения: 4179 Откуда: Сферическая Земля в вакууме. Зарегистрирован: 04.07.2003 |
|
DIMOSUS.X : |
Шарп под линуксом это изврат.
|
Учитывая -march=armv6zk пожалуй, да.
DIMOSUS.X : |
Главное память за собой чистить
|
Там такого главного - список на страницу. Причем его пункты временами расположены строго ортогонально.
Вот тебе выдержка из старого бояна для поднятия духа
Цитата: |
Мы остановились, добившись
успешной компиляции следующего:
Код: |
for(;P("\n"),R-;P("|"))for(e=C;e-;P("_"+(*u++/8)%2))P("| "+(*u/4)%2); |
Мы не могли даже представить, что современные программисты будут пытаться использовать язык, допускающий подобный оператор!
|
_________________ Конец света в конце тоннеля |
|
|
DIMOSUS.X 997 EGP
Рейтинг канала: 4(58) Репутация: 188 Сообщения: 3252 Откуда: Vilnius/Minsk Зарегистрирован: 06.08.2008 |
|
Diff : |
Учитывая -march=armv6zk пожалуй, да.
|
Теперь уже
не разобравшись использовал от первой малины.
А вообще изначально у меня все работало под mono — но глюки с COM портом и pipe достали. Плюс еще своеобразно работающий враппер OpenCV.
А теперь как ты его пишешь, так оно и работает — красота Правда кода пока не много, чисто своего 1к строк.
_________________ Даже ежики ежиков могут с трудом,
Иначе бы ежики были кругом. |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
DIMOSUS.X : |
как ты его пишешь, так оно и работает
|
Ну это уже asm какой-то, батенька Все таки в Си и ++ многие вещи уже автоматизированы (раскидывание нагрузки по ядрам ЦПУ, например). Но по сравнению с #, конечно как небо и земля. Ну и способов выстрелить себе в ногу пропорционально больше.
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
Последний раз редактировалось: ТехноМаг (22:49 02-01-2016), всего редактировалось 1 раз |
|
|
DIMOSUS.X 997 EGP
Рейтинг канала: 4(58) Репутация: 188 Сообщения: 3252 Откуда: Vilnius/Minsk Зарегистрирован: 06.08.2008 |
|
В муках родил вот такой мэйк файл:
Cкрытый текст (кликните здесь для просмотра)
Код: |
SOURCES = robot.cpp io.cpp motors.cpp radio.cpp bmp085.cpp I2Cdev.cpp MPU9150.cpp MadgwickAHRS.cpp PID.cpp camera.cpp
PROGRAM = robot
CXX = ccache g++
CCFLAGS = -fdiagnostics-color=always -pipe -Ofast -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 -Wall -Wstrict-aliasing=0
INCLUDES = -pthread -lwiringPi -lwiringPiDev -lm -lrf24-bcm -lopencv_core -lopencv_imgproc -lopencv_highgui -l bcm2835
OBJ_DIR = obj/
BUILD_PRINT = \033[1;34mBuilding $<\033[0m
OBJS = ${SOURCES:%.cpp=%.o}
.SUFFIXES: .cpp .o
.cpp.o:
@echo "$(BUILD_PRINT)"
@${CXX} ${CCFLAGS} -c $< -o $(OBJ_DIR)$@ ${INCLUDES}
$(PROGRAM): ${OBJS}
@echo "$(BUILD_PRINT)"
@${CXX} ${CCFLAGS} ${OBJS:%=$(OBJ_DIR)%} -o $(PROGRAM) ${INCLUDES}
clean:
rm -rf $(OBJ_DIR)*.o $(PROGRAM) |
|
Он сорит объектыми модулями в отдельную дерикторию и не перегружает лишней информацией Дает вот такой выхлоп:
Cкрытый текст (кликните здесь для просмотра)
|
_________________ Даже ежики ежиков могут с трудом,
Иначе бы ежики были кругом. |
|
|
|
|
|
Железный канал: «C, С++» |
|