当我0-初始化一个vector时,它和calloc有同样的效果吗?
When I 0-Initialize a vector Does It Have the Same Effect as calloc?
因此 calloc
调用 OS 以检索堆上的归零页面:
C++11 的 vector
构造函数如何只接受 size_t
和 0 初始化值?在一般情况下向 OS 询问归零页面,或者它是否需要初始化它自己,因为 vector
的元素可能是带有默认初始化程序的 class,默认成员到非零值?
std::vector<T>
是执行的一部分,这意味着我们只能看到结果,不一定能看到幕后的魔法。此外,只要可观察的结果保持不变,实现本身就可以(部分)专门化std::vector<T>
。
然而,这并不意味着 std::vector<int>
可以只向 OS 请求归零内存。它仍然必须经过 std::allocator
和 ::operator new
,即使你替换了后者。
当然,根据编译器的魔法法则,如果编译器知道你没有,它可能仍然会直接询问 OS。但该逻辑的主要问题是单独编译。当编译 A.cpp 包含 std::vector<int>
时,编译器不会知道 B.cpp 包含 ::operator new
.
因此 calloc
调用 OS 以检索堆上的归零页面:
C++11 的 vector
构造函数如何只接受 size_t
和 0 初始化值?在一般情况下向 OS 询问归零页面,或者它是否需要初始化它自己,因为 vector
的元素可能是带有默认初始化程序的 class,默认成员到非零值?
std::vector<T>
是执行的一部分,这意味着我们只能看到结果,不一定能看到幕后的魔法。此外,只要可观察的结果保持不变,实现本身就可以(部分)专门化std::vector<T>
。
然而,这并不意味着 std::vector<int>
可以只向 OS 请求归零内存。它仍然必须经过 std::allocator
和 ::operator new
,即使你替换了后者。
当然,根据编译器的魔法法则,如果编译器知道你没有,它可能仍然会直接询问 OS。但该逻辑的主要问题是单独编译。当编译 A.cpp 包含 std::vector<int>
时,编译器不会知道 B.cpp 包含 ::operator new
.