std::vector::resize 和直接初始化为零有什么区别吗?

  • 本文关键字:区别 初始化 resize vector std c++11
  • 更新时间 :
  • 英文 :


两者之间有什么区别吗:

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

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

还是第二种方法是第一种方法的简称?

性能是否有可衡量的差异?不,一点也不。

是否有可读性差异?分配器版本更加简洁,一目了然。

生成的指令有区别吗?取决于编译器及其选项。让我们来看看 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 执行内存寻址计算,但实际上并不寻址内存。优化器软糖。

请记住,编译器优化不是标准的。就语言本身而言,这两个调用之间根本没有区别。

最新更新