两者之间有什么区别吗:
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 执行内存寻址计算,但实际上并不寻址内存。优化器软糖。
请记住,编译器优化不是标准的。就语言本身而言,这两个调用之间根本没有区别。