为什么他们在STL的分配器和向量类中使用指针、void_pointer和其他typedef?

问题描述 投票:0回答:1

查看https://en.cppreference.com/w/cpp/memory/allocator

value_type
T
,

的 typedef(或别名)

pointer
T*
,

的 typedef(或别名)

void_pointer
void*
,

的 typedef(或别名)

从 STL 开发人员的角度来看,为什么我们需要这个?

T*
不总是一个指针吗?
void*
不是总是指向void的指针吗? 请给我一些解释或链接。 我实在是不懂这个。

c++ stl nested-types
1个回答
0
投票

std::allocator
只是 Allocator 接口的一种可能实现。用户可以编写自己的类型来满足 Allocator 概念,并且标准库类型(例如
std::vector
)也可以与这些分配器一起使用。

Allocator 接口需要这些 typedef,因为不需要要求这样的分配器实现使用

void*
作为 void 指针或
value_type*
作为指针类型。正如您在我上面链接的页面上看到的,它们只需要满足一些概念,例如NullablePointer,使它们的行为类似于本机原始指针。

这个想法是,您可以使用所谓的“花哨指针”来实现分配器,这些指针具有与本机原始指针不同的功能。这种指针类型的一个例子是 boost::interprocess::offset_ptr,它是一种类似指针的类型,指向自身的偏移量而不是绝对地址。如果您想将 std::vector

 存储在进程之间共享的内存中,这非常有用。由于每个进程都会将共享内存页面映射到各自地址空间中的不同基虚拟地址,因此绝对本机指针无法同时引用所有进程中的预期位置。

© www.soinside.com 2019 - 2024. All rights reserved.