Есть ли ощутимая разница в производительности?Нет, совсем нет.
Есть ли разница в читаемости?Версия распределителя гораздо лаконичнее и проще для понимания.
Есть ли разница в сгенерированных инструкциях?Зависит от компилятора и его опций.Давайте посмотрим, как gcc:
int main() {
std::vector<int> B(1);
}
компилируется в:
call std::allocator<int>::allocator() [complete object constructor]
lea rdx, [rbp-17]
lea rax, [rbp-48]
mov esi, 1
mov rdi, rax
call std::vector<int, std::allocator<int> >::vector(unsigned long, std::allocator<int> const&)
lea rax, [rbp-17]
mov rdi, rax
Другой случай:
int main() {
std::vector<int> B;
B.resize(1);
}
Компилируется в:
call std::vector<int, std::allocator<int> >::vector() [complete object constructor]
lea rax, [rbp-48]
mov esi, 1
mov rdi, rax
call std::vector<int, std::allocator<int> >::resize(unsigned long)
lea rax, [rbp-48]
mov rdi, rax
Они очень, очень похожи.Разница незначительна.Единственное отличие состоит в том, что в версии распределителя есть дополнительная инструкция LEA для загрузки std::allocator
(LEA выполняет вычисления адресации памяти, но фактически не обращается к памяти.) Выдумка оптимизатора.
Примитеобратите внимание, оптимизация компилятора не является стандартной.Насколько диктует сам язык, между этими двумя вызовами не будет никакой разницы.