ПредишенСледващото

Започва да учи асемблер знам C / C ++. Затова реших да се започне от знанието, че е вече там, и аз започнах да разглобявате писан закон и да видим как става това.

И веднага попаднах алогично момент.
Ако комплектът е функция на увеличаване на стойността на EAX аргумента вкл. тя трябва да се различава от добавяне на 1 до регистъра с добавка EAX, 1.
Аз обикновено се предположи, че ако има някои функции, така че те са по-ефективни. но ако погледнете кода аз ++:

Какво е по-добре да се използват: вкл, или да добавите в този случай?

Мисля, че компилаторът е глупак. Вероятно повлияни от факта, че теоретично резултат аз ++ все още може да се използва и след това заради това той се опитва да спаси резултата в R \ EAX. В действителност, компилаторът може да генерира

В допълнение, има ясно колкото три инструкции, вместо от един, и то със сигурност е по-бавно (освен ако стойността на аз ++ не е необходимо след това).

Що се отнася до изрична сравнението добавите EAX, 1 и с включени EAX, а след това аз подозирам, че разликата в скоростта е не, но цифрата 1 се извършва, което означава, че тя ще се проведе в кода на опашката за предварително извличане и може да играе отрицателна роля. И не мога да играя.

От друга страна, компилаторът използва Наистина е трудно да добавите EAX, 1:

Тя дава резултат, без да inc'a

От друга страна, Java JIT-компилатор понякога използва вкл. той видя ..

Е, и въпросите, разбира се, се питат! Всичко е толкова желязо зависими неща!

Общото правило е проста: по отношение на генерирането на асемблер съставител винаги по-умен код (осъзнаване) от теб. Ако той не направи това, то би било по-добре.

Втората мисъл: Вие сте основани на погрешна обещание. Въвеждането на нови машинни инструкции, не винаги са продиктувани от ефективността на компютри. Все още има такова нещо като ефективността на програмист - съгласен, вкл EAX да пиша много по-лесно, отколкото да добавите EAX, 1). И операция е изключително често.

Сега за това, защо се добави по-бързо от вкл. (Всичко, което ще напиша не се изисква за да е истина - аз просто мисля така). Фактът, че вкл. За разлика от добавката. Това не променя състоянието на флага за носене. Някои други знамена се променят. Тъй като аз не съм наясно с всяка архитектура, на която е възможно да се постави знамената един по един, не всички заедно, аз се опитвам да се посочат следните данни: Inc "в първо трябва да се помисли за текущото състояние на флага за носене (което води до фалшива връзка с последващото спирането на конвейера). И добави "в него не е необходимо, тъй като тя ще се записват. Следователно, увеличаването на производителността.

Послепис Отказ от отговорност отново: Направих това не е много добър, все още се разбере (контакт шест месеца по-късно - както изглежда, от времето, когато аз съм експерт в тази област =)). Просто някъде нещо такова чух \ чете.

Отговорено 14 '11 февруари в 21:57

GCC (GCC) 3.4.5 (MinGW-изглед специално R3)

вкл използва за аз ++ й ++

при съставянето с -O3 като цяло запазва променливи в регистрите. ССЗ -S -O3

вземане (за време) Код:

По отношение на скорост на изпълнение. Лично аз мисля, че скоростта на изпълнение x86 в цикличен код на един разумен размер за една модерна архитектура е изпълнение, колкото може да изглежда на пръв поглед изглежда по същия начин. Това се дължи на предварително извличане команди и превръщане на команди RISC-подобен процесор.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!