- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试实现一个 STL 风格的容器类,我有一个关于在我的类中使用分配器的问题:
STL 的 allocator_traits
中的静态成员函数有何用途?
直到现在,我认为我应该实例化 allocator_type
(可能通过某种空基优化来改善内存占用)。因此,我最终会得到这样的结果:
struct EmptyBaseOpt : allocator_type
{
EmptyBaseOpt(const allocator_type & a, allocator_type::const_pointer p)
: allocator_type(a), prefix_ptr(p) { }
allocator_type::pointer prefix_ptr;
}
EmptyBaseOpt ebo;
然后,我可以按以下方式使用分配器:
allocator_type & alloc = ebo;
alloc.allocate(100, ebo.prefix_ptr);
另一方面,C++11 中的 allocator_traits
似乎暗示了以下用法:
std::allocator_traits<allocator_type>::allocate(100, ebo.prefix_ptr);
我想这个静态allocate
成员函数可能会通过其默认构造函数创建一个allocator_type
的临时临时实例。但这会导致以下问题:
如果 allocator_type
是有状态分配器会发生什么?如果我在 allocator_traits
中使用静态成员函数而不是从 allocator_type
的实例调用非静态方法,这样的分配器是否能够保持它们的状态?
如果我可以直接使用 allocator_traits
中的静态成员函数,我为什么要实例化 allocator_type
并为 EBO 之类的东西烦恼?
如前所述,我的理解是任何类似类的模板参数都应该在我的容器类中实例化,以便允许这些参数的有状态版本。这种理解是否正确,它如何适应 allocator_traits
中的静态成员函数?
最佳答案
On the other hand, the allocator_traits in C++11 seem to imply the following usage:
std::allocator_traits<allocator_type>::allocate(100, ebo.prefix_ptr);
不,您错过了该函数调用最重要的参数:分配器。
I guess this static allocate member function will probably create a temporary ad-hoc instance of allocator_type via its default constructor.
不,因为您将分配器参数传递给函数。
What will happen if allocator_type is a stateful allocator?
它工作正常,因为您将该有状态分配器作为参数传递给使用它的函数。
Why should I instantiate allocator_type at all and bother with stuff like EBO if I can directly use the static member functions in allocator_traits instead?
因为你不能用它们代替。
As stated before, my understanding is that any class-like template parameters should be instantiated inside my container class in order to allow for stateful versions of these parameters. Is this understanding correct, and how does it fit with the static member functions in allocator_traits?
是的,你的理解是正确的,如果你使用得当,它很适合allocator_traits
。
allocator_traits
的要点是为大多数 Allocator 接口(interface)提供合理的默认值。这有两个目的:
首先,在 C++11 中定义分配器更简单(您只需要提供 value_type
、allocate
、deallocate
,一个用于重新绑定(bind)分配器和 operator==
和 operator!=
的模板构造函数,因此现在编写简单的自定义分配器要简单得多。
其次,它允许 C++11 容器使用仅满足 C++03 分配器要求的现有分配器。 C++03 分配器未定义嵌套成员,例如 C++11 容器查找的 propagate_on_container_swap
,或新的可变参数 construct(pointer, Args&&...)
允许使用任何参数构造对象的成员,而不仅仅是复制构造的(这是允许 emplace
工作的)。因此,通过在 allocator_traits
中包装分配器的使用,大多数分配器接口(interface)都被赋予了合理的默认值,因此现有的 C++03 代码使用带有容器的自定义分配器,例如 std::vector
如果使用 C++11 重新编译,构建不会突然失败。 std::vector
实现仅通过 allocator_traits
类型使用新成员,因此自定义分配器未更新以提供所有新成员并不重要这是 C++11 分配器要求的一部分。
关于c++ - STL 的 allocator_traits 中静态成员函数的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32136595/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!