gpt4 book ai didi

c++ - 分配器 : how are the standard containers expected to work internally?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:14 26 4
gpt4 key购买 nike

作为这个问题的示例,我将使用 std::vector
它的定义来自 documentation如下:

template<class T, class Allocator = std::allocator<T>>
class vector;

正如预期的那样,如果 T 是它的类型,分配器应该偏向于 T
总之,下面的代码编译没有错误(至少,使用 GCC)并运行:

#include<vector>
#include<memory>
#include<string>

struct S {
int i;
double d;
std::string s;
};

int main() {
std::allocator<int> alloc;
std::vector<S, std::allocator<int>> v{alloc};
v.push_back(S{});
}

在这里,我通过使用专注于 int 的分配器创建 vectorS

它是合法的代码吗?我应该期待未定义的行为吗?还有什么?
我不完全理解这背后的魔力以及为什么 STL 允许用户这样做。
另一方面,rebind 之类的东西只在 std::list 的文档中提到,我不知道它们是否也适用于这种情况。

在其他热力学中,如果它有效,我想知道它为什么有效(它背后是 rebind 吗?),否则我想知道为什么它被允许。

最佳答案

表 98 -- 分配器感知容器要求在其第一行中说:

Requires: allocator_type::value_type is the same as X::value_type

客户端代码违反 Requires 子句会导致未定义的行为。

gcc 和 VS 没有检测到这个错误。它们通过将分配器重新绑定(bind)到适当的类型来允许代码工作。 libc++ 使用 static_assert 主动检测此错误.

http://melpon.org/wandbox/permlink/LVYEHfVIGoyZsii8

vector 的所有三个实现在这方面是有效的。

libc++ 主动检测此错误的基本原理是更快地(在编译时)为您找到错误。如果在大型程序中有两个 vector ,那将是一件坏事:vector<int, some_allocator<int>>vector<int, some_allocator<long>>并且程序逻辑假设它们是同一类型。

关于c++ - 分配器 : how are the standard containers expected to work internally?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35256098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com