Есть ли разница между std :: vector :: resize и прямой инициализацией в ноль - PullRequest
0 голосов
/ 30 декабря 2018

Есть ли разница между:

std::vector<int> B;
B.resize(N);

и

std::vector<int> B(N); //or std::vector<int> B(N,0);

или второй метод является краткой формой первого метода?

1 Ответ

0 голосов
/ 30 декабря 2018

Есть ли ощутимая разница в производительности?Нет, совсем нет.

Есть ли разница в читаемости?Версия распределителя гораздо лаконичнее и проще для понимания.

Есть ли разница в сгенерированных инструкциях?Зависит от компилятора и его опций.Давайте посмотрим, как 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 выполняет вычисления адресации памяти, но фактически не обращается к памяти.) Выдумка оптимизатора.

Примитеобратите внимание, оптимизация компилятора не является стандартной.Насколько диктует сам язык, между этими двумя вызовами не будет никакой разницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...