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

时间:2018-12-30 12:57:56

标签: c++11

两者之间是否有任何区别

cell.profilePic.image = nil
self.showProfilImage(uid: self.items[indexPath.row].user.uid!) { (image) in
        cell.profilePic.image = image
    }

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

还是第二种方法是第一种方法的缩写形式?

1 个答案:

答案 0 :(得分:2)

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

可读性上有区别吗?分配器版本更加简洁,一目了然。

生成的指令是否有所不同?取决于编译器及其选择。让我们来看看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进行内存寻址计算,但实际上不寻址内存。)优化器错误。

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