能保证std::vector默认构造不调用new吗?

Is it guaranteed that std::vector default construction does not call new?

根据 the reference,一个简单的 std::vector<T> vec; 创建一个空容器(默认构造函数)。这是否保证没有动态内存分配? 或者一个实现可能选择保留一些内存?

我知道,对于这个空的构造函数,自 C++11 以来就没有 T 类型的构造。 但是,我想知道,是否也可以保证堆上没有分配任何内容。 IE。上面那行只是 stack/member.

上的几行 nullptr

我用vc140测试过,确实没有动态分配。

Does this guarantee that there is no dynamic memory allocation?

没有。然而,实现不分配内存是很典型的。我还没有看到这样的标准库实现。

Or may an implementation chose to reserve some memory?

可能有,但这是不典型的。

I known that, for this empty constructor, there is no construction of the type T since C++11

也在 C++11 之前。

std 库是 C++ 语言的一部分。

几乎对任何 std 库 class 或函数的任何调用都可能造成病态和疯狂的事情。但 int x=7; 也是如此——编写标准并不是为了抵御坦率的敌对 C++ 实现,其中包括 std 库。

也就是说,std 向量的零参数构造函数是 noexcept。这意味着打算不分配。无论分配是否成功,恶意实现都可以自由分配、捕获任何错误并继续进行。恶意实施也可以自由计数到 47 万亿,运行 对随机数据进行一些 FFT,启动神经网络并针对莎士比亚对其进行训练,创作一些十四行诗,然后就好像什么都没发生一样继续进行。该标准对 C++ 中任何操作的不可观察的诗歌组成没有任何说明;只要动作没有可观察到的(在抽象机器内)副作用,标准就没有意见。

实际上,std::vector<T>() 没有理由分配,以后对其进行的操作都不能假定它已分配。我可以看到一个检测构建分配了一些生命周期跟踪令牌来强制执行迭代器失效错误,但这只会在带有额外标志的调试中启用(例如 -DCMP_JUN17)。

忧诗不如唤新

无法保证。

我刚刚遇到的一个反例(这让我想到了这个 post)是 MSVC2017 的 STL 实现,如果 _ITERATOR_DEBUG_LEVEL > 0.