История изменений
Исправление alysnix, (текущая версия) :
Пример иллюстрирует эффективность передачи moveable типов по значению.
а вы не видите там, что компилятор в данном режиме делает копию извне, и это нужно для того, чтобы иногда использовать movable.
то есть код вызова ВСЕГДА вздувается минимум вдвое, ради того, чтоб ИНОГДА, не было вызова лишнего копирования.
вот вызов по конст.ссылке и по копии, функции где параметр - просто локальная переменная
конст ссылка
leaq -2800(%rbp), %rax
leaq -3200(%rbp), %rdx
movq %rdx, %rsi
movq %rax, %rdi
call pass_by_ref(string_like const&)
с копией
leaq -3200(%rbp), %rdx
leaq -2000(%rbp), %rax
movq %rdx, %rsi
movq %rax, %rdi
call string_like::string_like(string_like const&) [complete object constructor]
leaq -2400(%rbp), %rax
leaq -2000(%rbp), %rdx
movq %rdx, %rsi
movq %rax, %rdi
call pass_by_value(string_like)
из 5 команд вызова стало 10, это называется эффективностью? а размер кода уже не является одним из факторов эффективности?
Исходная версия alysnix, :
Пример иллюстрирует эффективность передачи moveable типов по значению.
а вы не видите там, что компилятор в данном режиме делает копию извне, и это нужно для того, чтобы иногда использовать movable.
то есть код вызова ВСЕГДА вздувается минимум вдвое, ради того, чтоб ИНОГДА, не было вызова лишнего копирования.
вот вызов по конст.ссылке и по копии, функции где параметр - просто локальная переменная
конст ссылка
subq $3200, %rsp
leaq -2800(%rbp), %rax
leaq -3200(%rbp), %rdx
movq %rdx, %rsi
movq %rax, %rdi
call pass_by_ref(string_like const&)
с копией
leaq -3200(%rbp), %rdx
leaq -2000(%rbp), %rax
movq %rdx, %rsi
movq %rax, %rdi
call string_like::string_like(string_like const&) [complete object constructor]
leaq -2400(%rbp), %rax
leaq -2000(%rbp), %rdx
movq %rdx, %rsi
movq %rax, %rdi
call pass_by_value(string_like)
из 5 команд вызова стало 10, это называется эффективностью? а размер кода уже не является одним из факторов эффективности?