LINUX.ORG.RU

Во что компилируется C++?

 


2

4

Хочу научиться смотреть, во что скомпилился какой-нибудь метод класса.

Мне интересно прежде всего:
- заинлайнился метод или функция или нет
- сколько регистров / памяти сожрали аргументы
- как вернулся результат, использовалась ли RVO (Return Value Optimization) или нет.
- посмотреть на всё это и подумать про эффективность юзания кеша

Я так понимаю, надо делать g++ -S code.cpp и тупо читать асмокод? Аскомод в том формате, в котором генерит его по умолчанию g++ или есть более правильный формат? Или может есть спец-просмотровщики этого ассемблера, сильно облегчающие его понимание?

Что помогает «смотреть на всё это и думать об эффективности юзания кеша»? Валгриндовый кешгринд - это да, но это эмпирический путь.

Полученный asm уже не подвергается никакой оптимизации, а в таком виде и будет преобразован в бинарь и поступит в проц? (т.е. дальнейшие оптимизации уже будет делать проц со своими конвейерами?)



Последнее исправление: hlamotron (всего исправлений: 2)

Можно использовать второй или третий уровень оптимизации (-O2/-O3) — так код может оказаться проще для понимания.

Или может есть спец-просмотровщики этого ассемблера, сильно облегчающие его понимание?

Не знаю сильно ли, но с IDA несколько проще рассматривать код.

Deleted
()

Я так понимаю, надо делать g++ -S code.cpp и тупо читать асмокод?

Можно добавить -fverbose-asm

deadskif
()

Что помогает «смотреть на всё это и думать об эффективности юзания кеша»? Валгриндовый кешгринд - это да, но это эмпирический путь.

Изучай cache-oblivious алгоритмы, все остальное - чистая эмпирика

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

так код может оказаться проще для понимания

а может сложнее из-за инлайнов

annulen ★★★★★
()

Так как вся эта информация есть у GCC и доступна (возможно, не в 100% полном объёме) плагинам, можно такой плагин и написать. Не самое простое занятие, но результаты должны быть наиболее точными, в произвольной форме и для этого не придётся рассматривать ассемблер.

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

AT&T уж куда удобней и читабельней, а почему ви спгашиваете?

Ага, один синтаксис арифметики чего стоит.

Stil ★★★★★
()

Читать о том как работает компайлер. Гдето должно быть это описано.

invy ★★★★★
()

Мне интересно прежде всего:
- заинлайнился метод или функция или нет
- сколько регистров / памяти сожрали аргументы
- как вернулся результат, использовалась ли RVO (Return Value > Optimization) или нет.
- посмотреть на всё это и подумать про эффективность юзания кеша

Компилятор от intel умеет генерить optimization report. Обрати внимание на него

Anvill
()

Всё правильно понимаешь.

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

Про cache-oblivious знаю, даже знаю про Ван Эмде Боас лэйаут!

hlamotron
() автор топика
Ответ на: комментарий от Anvill

А почему именно так, с привлечением objdump?

hlamotron
() автор топика
Ответ на: комментарий от Stil

После кодинга на tasm/fasm/masm синтаксис AT&T конечно кажется ущербным. Но в силу его засилья в юниксах, придётся смириться и полюбить.

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

Учитывая, что хуже tasm/masm сложно что-то найти, gas просто прелестен в сравнении. Nasm и прочие конечно поприятней в целом, но раз уж в gcc gas, то и к AT&T можно привыкнуть, он вполне удобен.

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

Хотя справедливости ради гцц умеет в интел синтаксис. Но это лишь вопрос привычки.

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

tasm/fasm/masm

При том что они в мелочах расходятся, все становится не так уж однозначно.

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

Да, про это, ну и ты уже сам процитировал почему AT&T говно.

Не, понятно, что это всё вкусовщина и субъективщина, но.

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

Я для понимания кода использую clang с флагом -S -emit-llvm он так намного понятнее и приятнее его читать.

Это более высокий уровень, может ТС хочет на уровне микроархитектуры разбираться, раз уж он в кэши полез

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

Не вижу говно, вижу эмоции. Шо одно, шо другое — разницы особой нет.

beastie ★★★★★
()

Функции-члены инлайнятся или при явном указании, или когда они определяются в теле класса. Ну, и, конечно же, как компилятор захочет.

l4gfcm ★★
()

читай Соглашения о вызовах, используемые разными компиляторами с языка C++ в разных ОС, и исходники crt0 и libstdc++ — ту часть, которая выполняется до запуска main (запуск констукторов) и после (деструкторов).

ещё в первом приближении напиши объектно-ориентированный хелловорд на языке Vala, скомпилируй его с -C (в hello.c), и посмотри скодогенерированный исходник (с рантаймом GObject, GLib).

примерно в такое вот и компилируется. в первой версии C++ (CFRONT) примерно так всё и работало.

гугли C++ ABI, name mangling, C++ calling convention, исходники C++ runtime

anonymous
()

В реальной жизни твой код вероятно будет компилироватьсяс -O2 и мб еще какими ключами, так что их не забудь.

hlebushek ★★
()

выхлоп с плюсов на асме далеко не самый читабельный. если бы с сишечки - тогда вообще всё просто. а в плюсах много всякого лишнего и компилятор там извращается, как только может и за счёт оптимизаций код становится весьма мало похож на оргинал. если не знать ассемблер хорошо, хрен разберёшься.
и вот это - -masm=intel правильно подсказал анонимус. ибо обычный GAS нечитабелен.

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

Уж простите, но я вижу только

кококо

над си оптимизатор тоже занатно извращается, от оригинального кода ничего не остаётся

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

Так вот и я о том, почему то люди убившие на что-то много лет жизни, считают, что их позиция куда более верная и обоснованная. И придираются к совершенным мелочам. Между прочим, мир не стоит на месте, каждый год происходит очень значительное развитие в любой сфере.

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

ну, ваше кококо от моего отличается только наличием многолетнего опыта разработки, в моём случае.

Его кококо отличается от твоего тем, что он прав (и мой опыт разработки не меньше твоего).

tailgunner ★★★★★
()

Что помогает «смотреть на всё это и думать об эффективности юзания кеша»?

рано тебе об этом думать, судя по вопросу. когда вопросов как смотреть то, что генерирует компилятор, не будет, то может и вопрос про кэш отпадёт. а так - бенчмарки, CPU performance counters, теория итд.

dzidzitop ★★
()

Что помогает «смотреть на всё это и думать об эффективности юзания кеша»? Валгриндовый кешгринд - это да, но это эмпирический путь.

Другого пути измерить что-то, кроме эмпирического, нет. Другое дело, делать соответствующие поправки в код, но без измерений они бессмысленны

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

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

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