LINUX.ORG.RU

Рекомендации по C++


0

1

Доброго времени суток. Было дано такое задание: провести у потока лекцию относительно С++, где было бы отвечено на вопрос «а как лучше?». Необходимо рассказать про типы данных, когда какие выгоднее использовать из соображений экономии памяти и стандарты форматирования кода. Материала мало. Кто что может посоветовать еще рассказать по теме?


книга автора С++ по С++ очень хороша. К тому же у него новая книга вышла, но в этот раз для начинающих программистов.

anonymous
()

Мейерс. Эффективное использование C++
Саттер, Александреску. Стандарты программирования на С++

reader
()

Расскажите про size_t, ptrdiff_t, assert(), static_assert(). Про то, что правильно итерироваться по массиву можно только size_t i. Расскажите про алиасинг.

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

Да, не забудьте напомнить, что глупо закладываться на определённый размер типов данных и следует использовать типы из cstdint (stdint.h) если нужен строго определённый размер.

Ещё можно про cstd* версии заголовочных файлов для C++ рассказать (stdint.h -> cstdint).

bvvv
()

В контексте C++ (не C) на вопрос «а как лучше?» я бы рассказал про использование шаблонов проектирования, технологии освобождения памяти и прочие абстрактные штуки в ракурсе C++. Хотя, конечно же, зависит от искушённости слушателя.

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

> 2) Взять ЛИСП. ... n) Профит.

вас уже можно поздравить с успехом?

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

Они весьма специфичны и для студентов противопоказанны.

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

Спорно. double больше занимает в памяти и можно за одну инструкцию (SSE2) оперировать с векторами только из 2 double вместо 4 float.

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

> 1) Выкинуть С++. 2) Взять ЛИСП. ... n) Профит.

Брать ЛИСП не стоит, CL можно попробовать.

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

на второй половине можно рассказать про эффективность (в плане памяти) своих велосипедов, но бОльшую простоту использования stl и boots

burzumko
()

Судя по вопросам, тебе не стоит проводить никакую лекцию. Возможно одним-двумя-тремя..... быдлокодерами станет меньше

Captcha
()

Можно значительно сократить лекцию, если объяснить, в каких случаях нужно пользоваться С++, а в каких - С. И что не надо забывать про бритву Оккама и пытаться на плюсах решать все подряд.

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

>Можно значительно сократить лекцию, если объяснить, в каких случаях нужно пользоваться С++, а в каких - С. И что не надо забывать про бритву Оккама и пытаться на плюсах решать все подряд.

Все задачи, реашемы на С, решаемы и на С++, причем зачастую с бОльльшим комфортом. А про необходимость ООП я не говорил

annulen ★★★★★
()

> правильно итерироваться по массиву можно только size_t i

ptrdiff_t знаковый, теплый ламповый, им тоже Ъ.

Стандарты форматирования кода? если вам нравится K&R расскажите про него. (Если же конечно вы думаете что остальные стандарты форматирования от лукавого).

Если хотите студентиков завлечь - С++ не тот язык, как правило, завлекуха с С++ заканчивается выяснением незнаний препода (студенты любят это дело).

Если не хочется никого завлекать в приплюснутые сети можно рассказать про синтаксис и пунктуацию ;), тобишь взять стандарт и выдрать рендомные главы.

nikitos ★★★
()

Про C++ рассказывать стоит главным образом о том, как на нем писать нельзя. Но в контексте обучения студентов это выглядит довольно некорректно, естественно.

C++ из универов надо гнать ссаными тряпками.

Love5an
()

Hнесколько слов насчёт аргументов функций. Студенты часто используют там константные ссылки, даже если это не к месту.

При вызове someFunc(T) создаётся копия объекта, и она передаётся в функцию.

При вызове someFunc(&T) создаётся указатель на объект и этот указатель передаётся в функцию (где автоматически разыменовывается).

Таким образом, функция someFunc(&T) будет быстрее someFunc(T) во всех случаях, когда размер указателя занимает в памяти меньше, чем сам объект — sizeof(T*) < sizeof(T).

Далее приведены размеры объектов и размеры указателей на них в x86_64 системе с Arch Linux и GCC 4.5.

bool:	     1  8
char:	     1  8
short:	     2  8
int:	     4  8
float:	     4  8
double:	     8  8
long:	     8  8
long long:   8  8
long double: 16 8
MyEnum1:     4  8	//enum с двумя вариантами
MyEnum2:     4  8	//enum с кучей вариантов
MyClass1:    4  8	//класс с одним int
MyClass2:    8  8	//класс с двумя int
MyClass3:    12 8	//класс с тремя int
MyClass4:    16 8	//класс с одним int и одним double
MyClass5:    16 8	//класс с двумя double
MyClass6:    24 8	//класс с двумя double и одним int
MyClass7:    24 8	//класс с тремя double

Tаким образом, в данном случае размер указателя не зависит от типа объекта и всегда равен 8 байтам (и это неудивительно, ведь это просто адрес в памяти).

Следовательно, someFunc(T) будет вызываться медленнее, чем someFunc(&T), только для long double и объектов большинства нестандартных классов. То есть для всех стандартных типов, кроме long double, следует использовать передачу с копированием объекта, а не передачу по ссылке.

Хотелось бы отметить, что указатель может весить и не 8 байтов, а некоторые типы могут весить и не столько, сколько я указал. Это зависит от платформы и от компилятора. Но в большинстве случаев, объекты стандартные типов и элементы enum'ов всё равно занимают в памяти не больше, чем указатели.

Текст этот я писал для себя, когда был ОЧЕНЬ далеко от цивилизации и не имел литературы, так что, возможно, что-то и некорректно сказал. Но в целом, сказанное выше верно, что подтверждается тем, где и какие аргументы используются в Qt.

Obey-Kun ★★★★★
()
Ответ на: комментарий от Captcha

Необходимо, таков договор автомата за след. курс

sudo-s
() автор топика
Ответ на: комментарий от nikitos

Стандарты форматирования кода? если вам нравится K&R расскажите про него. (Если же конечно вы думаете что остальные стандарты форматирования от лукавого).

С первого курса преподавательи все давали в стиле Олмана, пойдет в штыки, но в лекцию все же включил, т.с. для общего развития.

Если хотите студентиков завлечь - С++ не тот язык, как правило, завлекуха с С++ заканчивается выяснением незнаний препода (студенты любят это дело).

Да я и сам студент, лекцию надо дать своему же потоку, а некорректность алгоритмов препода помимо меня из 130 человек видят еще двое.

sudo-s
() автор топика
Ответ на: комментарий от sudo-s

Повторю, возможно там что-то неправильно (но выводы верны точно). Насчёт размеров указателей и объектов лучше обратись в гугл.

Obey-Kun ★★★★★
()
Ответ на: комментарий от sudo-s

ещё можешь рассказать про документирование кода с помощью Doxygen (хорошая вещь, выручает при возвращении к собственным проектам)

про иерархию проектов и системы сборки (qmake, cmake, ...)

про существующие компиляторы (в т.ч. новомодный, как его там, на l)

как-то так...

ах да, а ещё про то, как называть классы, члены в классах и прочее... например, как принято в большом кол-ве проектов:
- SomeClass для классов.
- m_some_var (или some_var_, хотя мне так меньше нравится) для полей... называть надо с умом, например: m_width, m_density, m_is_applied, m_can_start.
- someFunc() для всяких методов
- someVar() для геттеров и setSomeVar(T var) для сеттеров
- some_var для временных переменных (внутри методов)...

Таким образом, при взгяде на имя чего-либо, сразу ясно, что это.

Мне кстати очень нравится KDE coding style по поводу отступов и пробелов: http://techbase.kde.org/Policies/Kdelibs_Coding_Style

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

Если контингент услышит слово «Линукс», аудитория будет выглядеть так: (О_О) х 150 человек. Надо простой, но полезный материал.

sudo-s
() автор топика
Ответ на: комментарий от sudo-s

ну, про названия и codyng style ж вроде бы полезно и доступно?

Obey-Kun ★★★★★
()
Ответ на: комментарий от bvvv

>правильно итерироваться по массиву можно только size_t i.
Правильно - через std::vector<T>::iterator i.
Потому что С++, а не pure C.

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

>double больше занимает в памяти и можно за одну инструкцию (SSE2) оперировать с векторами только из 2 double вместо 4 float.
Тем не менее тов. Страуструпп советует использовать double и прибегать к float только если точно известно, что это необходимо. Наверное, неспроста.

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

В общем случае действительно оснований использовать float вместо double нет. ОДНАКО для таких вещей, как движки 2d- и 3d-графики, а также другие программы, требующие быстрой работы с векторами и матрицами, использование float вместо double может значительно ускорить работу (за счет SSE2)

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.