История изменений
Исправление quasimoto, (текущая версия) :
После раскрытия макросов остаётся язык с функциями и http://www.lispworks.com/documentation/HyperSpec/Body/03_ababa.htm. Т.е. dotimes раскрывается, остаётся tagbody и т.п., они компилируются в такой же код, что и сишный for (чего там, можно считать, что за компиляцию for отвечает код подобный коду макроса dotimes).
CCL:
;;; (dotimes (i 10) (print i))
(xorl (% save0.l) (% save0.l)) ; [13]
(jmp L48) ; [16]
;;; (print i)
L18
(movq (% save0) (% arg_z)) ; [18]
(movl ($ 8) (% nargs)) ; [21]
(movq (@ 'PRINT (% fn)) (% temp0)) ; [26]
(nop) ; [33]
(callq (@ 10 (% temp0))) ; [34]
(leaq (@ (:^ L0) (% rip)) (% fn)) ; [37]
;;; (dotimes (i 10) (print i))
(addq ($ 8) (% save0)) ; [44]
L48
(cmpq ($ 80) (% save0)) ; [48]
(jl L18) ; [52]
^ только вызов print навороченный, что не имеет отношения к макросам и их влиянию на оптимизации.
Исходная версия quasimoto, :
После раскрытия макросов остаётся язык с функциями и http://www.lispworks.com/documentation/HyperSpec/Body/03_ababa.htm. Т.е. dotimes раскрывается, остаётся tagbody и т.п., они компилируются в такой же код, что и сишный for.
CCL:
;;; (dotimes (i 10) (print i))
(xorl (% save0.l) (% save0.l)) ; [13]
(jmp L48) ; [16]
;;; (print i)
L18
(movq (% save0) (% arg_z)) ; [18]
(movl ($ 8) (% nargs)) ; [21]
(movq (@ 'PRINT (% fn)) (% temp0)) ; [26]
(nop) ; [33]
(callq (@ 10 (% temp0))) ; [34]
(leaq (@ (:^ L0) (% rip)) (% fn)) ; [37]
;;; (dotimes (i 10) (print i))
(addq ($ 8) (% save0)) ; [44]
L48
(cmpq ($ 80) (% save0)) ; [48]
(jl L18) ; [52]
^ только вызов print навороченный, что не имеет отношения к макросам и их влиянию на оптимизации.